我想使用 dart 开发一个 Web 服务 + Web 套接字服务器,但问题是由于隔离中未捕获的异常,我无法确保服务器的高可用性。
当然,我已经尝试捕获了我的主要功能,但这还不够。
如果未来的 then() 部分发生异常,服务器将崩溃。
这意味着一个有缺陷的请求可以使服务器停机。
我意识到这是一个悬而未决的问题,但是有没有办法在不使 VM 崩溃的情况下确认任何崩溃,以便服务器可以继续服务其他请求?
谢谢你。
我想使用 dart 开发一个 Web 服务 + Web 套接字服务器,但问题是由于隔离中未捕获的异常,我无法确保服务器的高可用性。
当然,我已经尝试捕获了我的主要功能,但这还不够。
如果未来的 then() 部分发生异常,服务器将崩溃。
这意味着一个有缺陷的请求可以使服务器停机。
我意识到这是一个悬而未决的问题,但是有没有办法在不使 VM 崩溃的情况下确认任何崩溃,以便服务器可以继续服务其他请求?
谢谢你。
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()
为它返回,以便您在本地处理可能的错误。
主页上有一篇很长的文章,您应该阅读。
我过去所做的是使用主隔离来启动托管实际 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
}