Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart中未处理的异常_Dart - Fatal编程技术网

Dart中未处理的异常

Dart中未处理的异常,dart,Dart,我用Dart编写了一个Web服务器,对异常有一个疑问。在我的HttpServer requesthandler中,我在整个方法周围添加了一个try-catch块: try{ ... } catch(e) { ... } 因此,我希望这可以防止任何客户端请求导致Web服务器崩溃。问题是,当从该块中抛出某些异常时(大量嵌套在其他模块中,但仍然从该块启动),它会崩溃。以下是此类例外情况的示例: Unhandled exception: FutureUnhandledException: exce

我用Dart编写了一个Web服务器,对异常有一个疑问。在我的HttpServer requesthandler中,我在整个方法周围添加了一个try-catch块:

try{
 ...
} catch(e) {
 ...
}
因此,我希望这可以防止任何客户端请求导致Web服务器崩溃。问题是,当从该块中抛出某些异常时(大量嵌套在其他模块中,但仍然从该块启动),它会崩溃。以下是此类例外情况的示例:

Unhandled exception:
FutureUnhandledException: exception while executing Future
  Illegal argument(s)
original stack trace:
  #0      _StringBase._createFromCodePoints (dart:core-patch:1403:3)
  #1      _StringBase.createFromCharCodes (dart:core-patch:1400:33)
  #2      String.String.fromCharCodes (dart:core-patch:1788:43)
  #3      _StringDecoderBase.decoded (dart:io:6485:12)
  #4      _File.readAsString.<anonymous closure> (dart:io:1307:29)
  #5      _FutureImpl.transform.<anonymous closure> (bootstrap:881:37)

 #0      _FutureImpl._complete (bootstrap:844:11)
 #1      _FutureImpl._complete (bootstrap:848:5)
 #2      _FutureImpl._setException (bootstrap:873:14)
 #3      _CompleterImpl.completeException (bootstrap:948:30)
 #4      _FutureImpl.transform.<anonymous closure> (bootstrap:884:36)
 #5      _FutureImpl._complete (bootstrap:840:19)
 #6      _FutureImpl._complete (bootstrap:848:5)
 #7      _FutureImpl._setValue (bootstrap:862:14)
 #8      _CompleterImpl.complete (bootstrap:945:26)
 #9      _File.readAsBytes.<anonymous closure> (dart:io:1281:25)
 #10     _BaseDataInputStream._checkScheduleCallbacks.issueCloseCallback (dart:io:6345:59)
 #11     _Timer._createTimerHandler._handleTimeout (dart:io:6918:28)
 #12     _Timer._createTimerHandler._handleTimeout (dart:io:6926:7)
 #13     _Timer._createTimerHandler.<anonymous closure> (dart:io:6934:23)
 #14     _ReceivePortImpl._handleMessage (dart:isolate-patch:37:92)
未处理的异常:
FutureUnhandledException:执行Future时发生异常
非法论点
原始堆栈跟踪:
#0\u StringBase.\u createFromCodePoints(dart:core patch:1403:3)
#1 _StringBase.createFromCharCodes(dart:核心补丁:1400:33)
#2 String.String.fromCharCodes(省道:核心补丁:1788:43)
#3_StringDecoderBase.decoded(dart:io:6485:12)
#4_File.readAsString。(dart:io:1307:29)
#5.未来实施变革。(引导:881:37)
#0未来实施完成(引导:844:11)
#1.未来实施完成(引导:848:5)
#2 FutureImpl.setException(引导:873:14)
#3_CompleterImpl.completeException(引导:948:30)
#4.未来实施变革。(引导:884:36)
#5未来实施完成(引导:840:19)
#6.未来实施完成(引导:848:5)
#7 FutureImpl.setValue(引导:862:14)
#8_CompleterImpl.complete(引导:945:26)
#9_File.readAsBytes。(dart:io:1281:25)
#10 \u BaseDataInputStream.\u checkScheduleCallbacks.issueCloseCallback(dart:io:6345:59)
#11(计时器).(创建计时器句柄).(dart:io:6918:28)
#12(计时器)(createTimerHandler)(dart:io:6926:7)
#13 _Timer._createTimerHandler。(dart:io:6934:23)
#14 _ReceivePortImpl._handleMessage(dart:隔离补丁:37:92)
为什么这个不在试抓区被抓?它被抛出到从内部调用的代码中(即使它没有显示在stacktrace中)


我想我错过了一些关于Dart中异常是如何工作的,所以我希望您能启发我:)

使用,您必须使用该方法来处理异常。

一旦您意识到发生了什么,理解这个问题就相当简单了

问题是:传统控制流构造(
if
while
try/catch/finally
return
)的语义完全是同步的。他们期望程序的流程与源代码的流程一样。看看这个:

1      try {
2        while (...) {
3          if (...) {
4            doSomething();
5            doSomethingElse();
6          }
7        }
8      } catch (e) {
9        print('oh no, something wrong happen! error: $e');
10     } finally {
11       print('done!');
12     }
这个程序作为一个序列工作。第1行在第2行之前执行,第2行在第3行之前执行。第5行在第4行之后立即执行。第11行在第7行之后执行,如果发生异常,第11行也在第9行之后执行。这就是同步的意思

然而,同步程序已经不够好了。事件处理自然是异步的,从用户界面到高度可伸缩的网络服务器,事件随处可见。所以如果你写

1      try {
2        var text = 'this will be replaced by the content of the file';
3        new File('...').readAsText().then((result) {
4          text = result;
5          doSomethingThatMightCauseAnException(text);
6          print('read file, got $text');
7        });
8        print('invoked file read');
9        return text;
10     } catch (e) {
11       print('error: $e');
12     }
您必须了解您正在调用一个异步操作(
readAsText
方法)。在该程序中,第2行在第1行之后执行,第3行在第2行之后执行,但第4行在第3行之后不执行。文件读取被异步调用(想想“在后台”),程序继续。所以在这种情况下,在3号线之后,你将直接到达8号线。因此第9行(第8行之后)的
return
语句总是返回
“这将被文件的内容替换”
文本

然后,程序继续运行,直到完成(退出
main
功能)。但是它并没有停止,因为有一些代码“在后台”运行,并且有一个为它注册的处理程序(您通过调用
然后
方法注册了处理程序)。一旦系统读取完文件,它将调用处理程序(传递给
然后
方法的匿名函数)。只有在没有注册某个异步调用的处理程序时,程序才能停止

现在,您可能理解了第10行的异常处理程序只能捕获第3行发生的错误(打开文件时出错)。但是如果在第5行发生异常,它就不能在第10行被捕获,因为
catch
处理程序早就不存在了


剩下的只是正确使用API的问题。如果使用回调,则必须传递成功处理程序和错误处理程序;如果使用
Future
s,则必须使用成功处理程序调用
then
方法,使用错误处理程序调用
handleException
方法。

是否可以添加try块的内容?抱歉,但是如果我必须包含与异常相关的所有调用的代码,那将像是数千行一样。。。它是一个相当复杂的web服务器,在处理基于web的IDE后端的模块中会生成此异常。我希望有人能告诉我,我需要做更多的事情来捕捉“未来”中的例外情况,或者它必须发生在创造未来的地方。。。如果我试图以文本形式读取.png文件,则会生成异常。您能提供一个示例吗?答案已过时。我刚刚更新了链接,你可以在那里找到例子。好吧,但是如果链接又过时了怎么办?我建议在您的答案中发布一个示例或创建您自己的示例本文给出了如何使用
catchError
的一个很好的示例:我的这个答案刚刚出现在我的成就列表中,因此我想指出,这是在Dart获得
async
/
wait
之前编写的。这基本上仍然是正确的,但是使用
async
/
wait
,体验会有很大不同。