为了方便使用,假设我的应用程序中有一个BaseAudioHandler的实现:
class AudioPlayerHandler extends BaseAudioHandler {
@override
Future<void> play() async {
throw Error();
}
}
当我从事件处理程序中调用这个函数时:
void onPlayButtonTap() {
try {
audioPlayerHandler.play();
} catch (error) {
// Error is not caught, but in the console I see unhandled error message.
print(error.toString())
}
}
它不捕获方法中抛出的错误。
当然,这种方式的例子是没有意义的,但我遇到了这个问题,当试图加载一个无效的url,我不能在"常规"的方式处理。
[VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: Instance of 'Error'
#0 AudioPlayerHandler.play (package:audio_service_example/main.dart:197:5)
#1 MainScreen._button.<anonymous closure> (package:audio_service_example/main.dart:145:22)
#2 _InkResponseState.handleTap (package:flutter/src/material/ink_well.dart:1072:21)
#3 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:253:24)
#4 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:627:11)
#5 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:306:5)
#6 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:239:7)
#7 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:615:9)
#8 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:98:12)
#9 PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_ro<…>
我希望能够使用try-catch块来处理错误。
我可以在audiohandler实现中处理错误,假设我可以传播一个自定义事件,告诉处理程序的用户发生了错误,但这种解决方案似乎有点笨拙。
我也不确定这是我不知道的编程语言怪癖还是实现问题?尝试使用调试器逐步执行,但没有发现任何有意义的内容。
你能告诉我这个错误处理应该如何工作吗?
提前感谢!
这与Dart语言有关。
由于您将play
定义为异步方法,因此play
实际上不会抛出错误。它返回一个future,计算结果为错误。如果您将来await
,您将能够捕获错误:
try {
await audioPlayerHandler.play();