Ho un thread di lavoro che, quando termina, segnala un evento. Questo evento viene quindi eseguito il marshalling sul thread principale per notificarlo della terminazione del thread di lavoro. Quando il thread di lavoro incontra un'eccezione non gestita, voglio che questa eccezione venga gestita dal sistema di gestione degli errori del thread principale. Pertanto, il thread worker imposta una proprietà che indica la sua chiusura imprevista e salva l'eccezione in un'altra proprietà, quindi segnala l'evento ed esce.Quale eccezione da generare quando il thread si chiude in modo imprevisto?
Dopo che l'evento è stato eseguito il marshalling sul thread principale, voglio lanciare una nuova eccezione con l'eccezione originale impostata come eccezione interna. La mia domanda è: quale dovrebbe essere il tipo di questa nuova eccezione? Esiste una specifica System.somethingException per questo tipo di situazione, dovrei progettare la mia classe Exception per questa specifica situazione o lanciare un System.Exception standard con un messaggio appropriato da considerare appropriato?
codice 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
}
}
}
}
Direi che dipende da cosa sta facendo il thread.In realtà non mi piace AggregateException che appiattisce tutto su un errore generico così da ingoiare l'eccezione originale per qualcos'altro ... non sembra una buona idea. Lo clonarei (per mantenere la traccia dello stack originale) e lo avrei ripensato. Ma è solo la mia opinione ... –
Che cosa esattamente speri di succedere quando rileggi l'eccezione? Le probabilità del 99% sono che il tuo programma si bloccherà. Che è una buona cosa, qualcosa non è stato fatto e non hai alcuna speranza di farlo. Ma poi, non preoccuparti di cogliere l'eccezione in primo luogo. Crollerà anche, ma almeno avrai una diagnostica migliore e non dovrai scrivere codice inutile. –
@Adriano Invece di clonare e ripensare, non potresti semplicemente usare 'throw;'? Ciò mantiene la traccia dello stack originale, giusto? – JSQuareD