我正在用 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()
捕获和忽略致命异常是不明智的。(有龙:))