Dart Web Server:防止崩溃

时间:2013-06-24 08:36:31

标签: dart dart-isolates

Id'喜欢使用dart开发Web服务+ Web套接字服务器,但问题是我无法确保服务器的高可用性,因为隔离区中存在未经捕获的异常。

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

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

这意味着一个缺陷请求可能会导致服务器崩溃。

我意识到这是一个open issue,但有没有办法解决任何崩溃而不会导致虚拟机崩溃,以便服务器可以继续提供其他请求?

谢谢。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:3)

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

try-catch仅适用于同步代码。

doSomething() {
  try {
    someSynchronousFunc();

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

当您的异步方法完成或失败时,在使用doSomething方法完成程序后,它会发生“long”

编写异步代码时,通常通过返回未来来启动方法是个好主意:

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(),以便在本地处理可能的错误。

主页上有a great lengthy article,您应该阅读。