2

我想使用 dart 开发一个 Web 服务 + Web 套接字服务器,但问题是由于隔离中未捕获的异常,我无法确保服务器的高可用性。

当然,我已经尝试捕获了我的主要功能,但这还不够。

如果未来的 then() 部分发生异常,服务器将崩溃。

这意味着一个有缺陷的请求可以使服务器停机。

我意识到这是一个悬而未决的问题,但是有没有办法在不使 VM 崩溃的情况下确认任何崩溃,以便服务器可以继续服务其他请求?

谢谢你。

4

2 回答 2

3

Chris Buckett 为您提供了一种在服务器失败时重新启动服务器的好方法。但是,您仍然不希望您的服务器停机。

try-catch唯一适用于同步代码。

doSomething() {
  try {
    someSynchronousFunc();

    someAsyncFunc().then(() => print('foo'));
  } catch (e) {
    // ...
  }
}

当您的异步方法完成或失败时,它会在程序完成该方法后“长时间”发生。doSomething

当您编写异步代码时,通常最好通过返回一个未来来启动一个方法:

Future doSomething() {
  return new Future(() {
    // your code here.
    var a = b + 5; // throws and is caught.

    return someAsyncCall(); // Errors are forwarded if you return the Future directly.
  });
}

这可以确保如果您有抛出的代码,它会捕获它们并且调用者可以然后catchError()它们。

如果你这样写,你的崩溃就会少得多,假设你至少在顶层有一些错误处理。

每当您调用返回 Future 的方法时,要么直接返回它(如上所示),要么catchError()为它返回,以便您在本地处理可能的错误。

主页上有一篇很长的文章,您应该阅读。

于 2013-06-24T18:06:38.510 回答
3

我过去所做的是使用主隔离来启动托管实际 Web 服务器的子隔离。当您启动隔离时,您可以将“未捕获的异常”处理程序传递给子隔离(我也认为您也应该能够在顶层注册一个,以防止出现此特定问题,如问题所引用在原始问题中)。

例子:

import 'dart:isolate';

void main() {
  // Spawn a child isolate
  spawnFunction(isolateMain, uncaughtExceptionHandler);
}

void isolateMain() {
  // this is the "real" entry point of your app
  // setup http servers and listen etc...
}

bool uncaughtExceptionHandler(ex) {
  // TODO: add logging!
  // respawn a new child isolate.
  spawnFunction(isolateMain, uncaughtException);
  return true; // we've handled the uncaught exception
}
于 2013-06-24T08:54:36.467 回答