C# で一般的な離散イベント システム シミュレーション ライブラリを作成しています。その上に、特定の種類の離散イベント シミュレーションを実装する別のライブラリを作成します。これは、コードの統合バージョンです。
static class Engine
{
[ThreadStatic] internal static uint time;
//...
public static void Run(OnException onException = OnException.PauseAndRethrow,
IList<Type> exceptionsToPass = null)
{
//...
while (!stop)
{
Event e = currentTimeEventQueue.PopEvent();
if (e == null) break;
try {
e.Activate();
}
catch (EngineException ex)
{
// An engine method that shouldn't have been called
// was called, and Activate didn't handle that
// handle this situation...
}
catch (/* fatal exception type*/ ex)
{
throw;
}
catch (Exception ex)
{
// code to decides whether to dismiss exception
// pause, stop, reset based on parameters to this method
}
}
}
}
問題は、回復不能であることがわかっている例外タイプを具体的にキャッチする必要があるかどうかです (決して処理しようとすべきではありません)。それらの例外は何ですか(私は考えることができますOutOfMemoryException
とStackOverflowException
)。致命的な例外のリストはありますか? 私が覚えているように、それらのいくつかはキャッチできません。だから私はキャッチできる致命的な例外のリストに興味があります。私はそれらを再スローしたいだけで、何もしません。一方、他のタイプの例外を処理したいと考えています。または、これについて別の角度が必要かもしれません。
編集:わかりました、質問を書くときに大きな見落としをしました。Activate()
は抽象的です。汎用離散イベント システム シミュレーション ライブラリを作成しています。エンジンは のまったく未知のサブクラスで動作していEvent
ます。Activate()
したがって、あらゆる種類の例外をスローする可能性のある、まったく未知のメソッドを呼び出しています。この問題は無視することもできますが、呼び出し元にプロセスの制御を渡したいと考えています。メソッドへのパラメーターからわかるようRun()
に、呼び出し元は、呼び出しから例外が発生した場合にエンジンが何をするかを決定しますActivate()
(無視して続行するか、一時停止して再スローするか、または ... をエンジンに指示できます)。そのため、致命的な例外を他のすべての例外から分離しようとしています。呼び出し元がエンジンに、次の例外を無視するように指示した場合Activate()
致命的な例外をキャッチして無視するのは賢明ではありません。(ドラゴンがいます:))