Czy ktoś ma dobre przykłady używania scala.util.control.Exception
version 2.12.0 (version 2.8.0),? Próbuję to rozgryźć od typów.Używanie scala.util.control.Exception
Odpowiedz
Rzeczywiście - uważam to za bardzo mylące! Tutaj jest problem, gdzie mam jakąś nieruchomość, która może stanowić parsowalnym data:
def parse(s: String) : Date = new SimpleDateFormat("yyyy-MM-dd").parse(s)
def parseDate = parse(System.getProperty("foo.bar"))
type PE = ParseException
import scala.util.control.Exception._
val d1 = try {
parseDate
} catch {
case e: PE => new Date
}
Switching to do postaci funkcjonalnego:
val date =
catching(classOf[PE]) either parseDate fold (_ => new Date, identity(_))
W powyższym kodzie, okazuje catching(t) either expr
spowoduje Either[T, E]
gdzie T
jest typem throwable i E
jest typem wyrażenia. Następnie można go przekonwertować do określonej wartości za pomocą fold
.
Albo jeszcze inna wersja:
val date =
handling(classOf[PE]) by (_ => new Date) apply parseDate
To może trochę jaśniej - następujący są równoważne:
handling(t) by g apply f
try { f } catch { case _ : t => g }
Oto kilka przykładów:
kompilator/Scala/Narzędzia/nsc/interpreter/InteractiveReader.scala
def readLine(prompt: String): String = {
def handler: Catcher[String] = {
case e: IOException if restartSystemCall(e) => readLine(prompt)
}
catching(handler) { readOneLine(prompt) }
}
kompilatora/Scala/narzędzia/NSC/Interpreter.scala
/** We turn off the binding to accomodate ticket #2817 */
def onErr: Catcher[(String, Boolean)] = {
case t: Throwable if bindLastException =>
withoutBindingLastException {
quietBind("lastException", "java.lang.Throwable", t)
(stringFromWriter(t.printStackTrace(_)), false)
}
}
catching(onErr) {
unwrapping(wrapperExceptions: _*) {
(resultValMethod.invoke(loadedResultObject).toString, true)
}
}
...
/** Temporarily be quiet */
def beQuietDuring[T](operation: => T): T = {
val wasPrinting = printResults
ultimately(printResults = wasPrinting) {
printResults = false
operation
}
}
/** whether to bind the lastException variable */
private var bindLastException = true
/** Temporarily stop binding lastException */
def withoutBindingLastException[T](operation: => T): T = {
val wasBinding = bindLastException
ultimately(bindLastException = wasBinding) {
bindLastException = false
operation
}
}
kompilator/scala/tools/NSC/IO/Process.scala
def exitValue(): Option[Int] =
catching(classOf[IllegalThreadStateException]) opt process.exitValue()
library/scala/xml/include/sax /Main.scala
def saxe[T](body: => T) = catching[T](classOf[SAXException]) opt body
...
ignoring(classOf[SAXException]) {
includer.setProperty(lexicalHandler, s)
s setFilter includer
}
czy możesz trochę rozwinąć na przykładzie łowienia ... odwijającego? –
- 1. Używanie ContentResolver
- 2. Używanie django.db.connection.queries
- 3. Używanie XmlTextReader
- 4. Używanie SecureString
- 5. Używanie ACTION_CAPTIVE_PORTAL_SIGN_IN
- 6. Używanie jQuery.data
- 7. Używanie $ translateProvider.useUrlLoader
- 8. Używanie kodu Visual Studio i używanie zdefiniowanych symboli
- 9. Używanie RabbitMQ z nServiceBus (dla C#) vs używanie Amazon SQS
- 10. Używanie javax.xml.ws.Endpoint z HTTPS
- 11. Używanie danych JSON
- 12. Używanie waitpid lub sigaction?
- 13. Używanie => w PHP
- 14. Używanie Mercurial z Perforce
- 15. Używanie przeglądarki przewodowej http
- 16. Używanie QTQuick z haskell
- 17. Używanie GIT z Joomla
- 18. C: Używanie funkcji memset
- 19. Używanie Qt z DirectX?
- 20. Używanie boost.asio w cMake
- 21. Używanie django-rest-interface
- 22. Używanie :: w C++
- 23. Używanie D3 z Elmem
- 24. Stan. Używanie celu + = składnia
- 25. Używanie ggplot2 w gWidgetsRGtk2
- 26. Używanie Jupytera za proxy
- 27. Używanie NUnit z PCL
- 28. Używanie Tidhttp z Twebbrowser
- 29. Używanie Meteor z Requirejs
- 30. Używanie niezdefiniowanej stałej
Jeszcze jedna alternatywa: 'failAsValue (classOf [PE]) (nowa data) {parseDate}'. :) – missingfaktor