Id'喜欢使用dart开发Web服务+ Web套接字服务器,但问题是我无法确保服务器的高可用性,因为隔离区中存在未经捕获的异常。
当然,我已经尝试了我的主要功能,但这还不够。
如果未来的then()部分发生异常,服务器将崩溃。
这意味着一个缺陷请求可能会导致服务器崩溃。
我意识到这是一个open issue,但有没有办法解决任何崩溃而不会导致虚拟机崩溃,以便服务器可以继续提供其他请求?
谢谢。
答案 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,您应该阅读。