我有一个工作线程,当它终止时,表示一个事件。然后将此事件编组到主线程以通知工作线程的终止。当工作线程遇到未处理的异常时,我希望这个异常由主线程的错误处理系统来处理。因此,工作线程设置一个属性来指示其意外终止,并将异常保存在另一个属性中,然后发出事件并退出。当线程意外退出时抛出什么异常?
将事件整理到主线程后,我想抛出一个新异常,并将原始异常设置为内部异常。我的问题是:这个新Exception的类型应该是什么?对于这种情况是否存在特定的System.somethingException,是否应该为这种特定情况设计我自己的Exception类,或者是否会抛出一个标准的System.Exception和适当的消息?
C#-psuedo代码:
class MyThread
{
public TerminationState Termination { get; private set; }
public Exception UncaughtException { get; private set; }
public delegate void ThreadTerminatedDelegate(MyThread thread);
public event ThreadTerminatedDelegate ThreadTerminated;
private void run()
{
try
{
doSomeWork();
}
catch(Exception e)
{
UncaughtException = e;
Termination = TerminationState.AbortOnException;
ThreadTerminated(this);
return;
}
Termination = TerminationState.NormalTermination;
ThreadTerminated(this);
}
}
class MainThread
{
private MyThread myThread = new MyThread();
private void run()
{
myThread.ThreadTerminated += handleTermination;
myThread.Start();
}
private void handleTermination(MyThread thread)
{
if (InvokeRequired)
{
MyThread.ThreadTerminatedDelegate cb = new MyThread.ThreadTerminatedDelegate(handleTermination);
BeginInvoke(cb, new object[] { thread });
}
else
{
if (thread.Termination == TerminationState.AbortOnException)
{
if (isFatal(thread.UncaughtException))
throw new Exception("", thread.UncaughtException); //what to do here?
else
fixTheProblem();
}
else
{
//normal wrapping up
}
}
}
}
我想说这取决于线程在做什么。实际上,我不喜欢AggregateException,它将所有东西都平铺到一个通用的错误上,以便吞下原来的其他东西的异常......看起来不是那么好的主意。我会克隆它(保持原始堆栈跟踪),我会重新抛出它。但这只是我的意见... –
当你再次抛出异常时,你希望发生什么? 99%的可能性是你的程序会崩溃。这是一件好事,有些事情没有完成,你也没有希望完成。但是,那就是,首先不要去理解这个例外。它也会崩溃,但至少你会得到更好的诊断,不必编写无用的代码。 –
@Adriano而不是克隆和rethrowing,你不能只使用'throw;'?这保持了原始的堆栈跟踪,对吧? – JSQuareD