私は終了時にイベントを通知するワーカースレッドを持っています。このイベントは、メインスレッドにマーシャリングされ、ワーカースレッドの終了を通知します。ワーカースレッドが未処理の例外を検出すると、この例外はメインスレッドのエラー処理システムによって処理されます。そのため、ワーカースレッドは予期しない終了を示すプロパティを設定し、その例外を別のプロパティに保存し、イベントを通知して終了します。スレッドが予期せず終了したときにスローする例外はありますか?
イベントがメインスレッドにマーシャリングされた後、元の例外を内部例外として設定して新しい例外をスローしたいとします。私の質問は、この新しいExceptionの型はどうすればいいのですか?このような状況のために特定のSystem.somethingExceptionがあるかどうか、この特定の状況に対して自分自身のExceptionクラスを設計するか、適切なメッセージで標準System.Exceptionをスローする必要がありますか?
C#の-psuedoコード:私はあなたがTask
でバックグラウンド作業を行うと、そのタスクの継続で例外を処理することにより、未処理のバックグラウンド例外のハンドリングに必要なすべての例外を行うことができると信じて
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クローンと再スローイングの代わりに、 'throw;'を使うことはできませんでしたか?元のスタックトレースはそのままです – JSQuareD