Chris Buckett は、サーバーに障害が発生したときにサーバーを再起動する良い方法を教えてくれました。ただし、それでもサーバーがダウンすることは望ましくありません。
はtry-catch同期コードに対してのみ機能します。
doSomething() {
  try {
    someSynchronousFunc();
    someAsyncFunc().then(() => print('foo'));
  } catch (e) {
    // ...
  }
}
非同期メソッドが完了または失敗すると、プログラムがメソッドで完了してから「かなり」doSomething後に発生します。
非同期コードを記述するときは、通常、future を返すことによってメソッドを開始することをお勧めします。
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()、可能性のあるエラーをローカルで処理できるようにします。
ホームページに非常に長い記事がありますので、ぜひお読みください。