Scala защитное кодирование вокруг asInstanceOf принуждения
Показательный пример:
java.lang.ExceptionInInitializerError
at sun.misc.Unsafe.ensureClassInitialized(Native Method)
at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43)
at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:142)
at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1088)
at java.lang.reflect.Field.getFieldAccessor(Field.java:1069)
at java.lang.reflect.Field.get(Field.java:393)
at utest.runner.BaseRunner.runUTestTask(BaseRunner.scala:30)
at utest.runner.BaseRunner$$anonfun$utest$runner$BaseRunner$$makeTask$1.apply(BaseRunner.scala:95)
at utest.runner.BaseRunner$$anonfun$utest$runner$BaseRunner$$makeTask$1.apply(BaseRunner.scala:95)
at utest.runner.Task.executeInternal(Task.scala:48)
at utest.runner.Task.execute(Task.scala:19)
at sbt.TestRunner.runTest$1(TestFramework.scala:76)
at sbt.TestRunner.run(TestFramework.scala:85)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:185)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
at sbt.TestFunction.apply(TestFramework.scala:207)
Вот исходное местоположение, которое наталкивается на это исключение, а вот копия строки:
val suite = TestUtils.loadModule(name, testClassLoader).asInstanceOf[TestSuite]
Завтра я буду отлаживать Utest, чтобы отследить этот конкретный случай, который должен быть крайним случаем, поскольку это происходит только в одном из моих проектов с включенным тестированием (вероятно, связанных с путями каталогов и выравниванием пакетов там).
Но можете ли вы предложить хорошую форму защитного программирования, избегая такого рода ошибок отражения, чтобы код мог перехватить условие ошибки перед вызовом asInstanceOf
или, альтернативно, идиоматический код для блока перехвата - передающий причины сбоя приведения более действенным образом?