मैं फ़ंक्शन लिख रहा हूं जो केवल निश्चित प्रकार के अपवादों को पकड़ सकता है।
def myFunc[A <: Exception]() {
try {
println("Hello world") // or something else
} catch {
case a: A => // warning: abstract type pattern A is unchecked since it is eliminated by erasure
}
}
ऐसे मामले में jvm प्रकार के क्षरण को बायपास करने का सबसे अच्छा तरीका क्या है?
उत्तर:
उत्तर № 1 के लिए 17आप उपयोग कर सकते हैं ClassTag
जैसे की यह जवाब.
लेकिन मैं इस दृष्टिकोण को पसंद करता हूं:
def myFunc(recover: PartialFunction[Throwable, Unit]): Unit = {
try {
println("Hello world") // or something else
} catch {
recover
}
}
उपयोग:
myFunc{ case _: MyException => }
का उपयोग करते हुए ClassTag
:
import scala.reflect.{ClassTag, classTag}
def myFunc[A <: Exception: ClassTag](): Unit = {
try {
println("Hello world") // or something else
} catch {
case a if classTag[A].runtimeClass.isInstance(a) =>
}
}
ध्यान दें कि सामान्य रूप से आपको उपयोग करना चाहिए Try
साथ में recover
तरीका: Try
ही पकड़ेंगे NonFatal
अपवाद नहीं।
def myFunc(recover: PartialFunction[Throwable, Unit]) = {
Try {
println("Hello world") // or something else
} recover {
recover
}.get // you could drop .get here to return `Try[Unit]`
}
जवाब के लिए 2 № 2
हर प्रकार की जाँच के लिए (उदा। case a: A
) JVM को इसकी आवश्यकता है class
जाँच करने के लिए ऑब्जेक्ट। आपके मामले में जेवीएम के पास वर्ग वस्तु नहीं है, क्योंकि A
एक चर प्रकार पैरामीटर है। हालाँकि, आप इसके बारे में अतिरिक्त जानकारी प्राप्त कर सकते हैं A
अनुमान से Manifest[A]
सेवा मेरे myFunc
। एक आशुलिपि के रूप में आप बस जोड़ सकते हैं : Manifest
आपके प्रकार की घोषणा A
:
def myFunc[A <: Exception : Manifest]() {
try {
println("Hello world") // or something else
} catch {
case a: A => // warning: abstract type pattern A is unchecked since it is eliminated by erasure
}
}