Tôi có một chuỗi công nhân, khi nó chấm dứt, báo hiệu một sự kiện. Sự kiện này sau đó được marshalled trên thread chính để notifiy nó chấm dứt thread của công nhân. Khi chuỗi công nhân gặp một ngoại lệ không được xử lý, tôi muốn ngoại lệ này được xử lý bởi hệ thống xử lý lỗi của luồng chính. Do đó, chuỗi công nhân đặt thuộc tính cho biết kết thúc không mong muốn của nó và lưu ngoại lệ trong thuộc tính khác, sau đó báo hiệu sự kiện và lần thoát.Ngoại lệ gì để ném khi thoát khỏi chuỗi bất ngờ?
Sau khi sự kiện đã được marshalled qua chủ đề chính, tôi muốn ném một ngoại lệ mới với ngoại lệ ban đầu được thiết lập như là ngoại lệ bên trong. Câu hỏi của tôi là: Loại ngoại lệ mới này là gì? Có một System.somethingException cụ thể cho loại tình huống, tôi nên thiết kế lớp ngoại lệ của riêng tôi cho tình huống cụ thể này, hoặc sẽ ném một System.Exception tiêu chuẩn với một thông điệp thích hợp được coi là thích hợp?
C# mã -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
}
}
}
}
Tôi muốn nói rằng điều đó phụ thuộc vào những gì chuỗi đang thực hiện.Trên thực tế tôi không thích AggregateException rằng tất cả mọi thứ bằng phẳng để một lỗi chung chung để nuốt các ngoại lệ ban đầu cho cái gì khác ... không nhìn ý tưởng tốt như vậy. Tôi sẽ sao chép nó (để giữ lại dấu vết ngăn xếp ban đầu) và tôi sẽ làm lại nó. Nhưng đó chỉ là ý kiến của tôi ... –
Chính xác điều gì bạn hy vọng sẽ xảy ra khi bạn ném ngoại lệ một lần nữa? Tỷ lệ 99% là chương trình của bạn sẽ bị lỗi. Đó là một điều tốt, một cái gì đó đã không được thực hiện và bạn không có hy vọng làm cho nó được thực hiện. Nhưng sau đó, chỉ cần không bận tâm để bắt ngoại lệ ở nơi đầu tiên. Nó sẽ sụp đổ là tốt, nhưng ít nhất bạn sẽ nhận được một chẩn đoán tốt hơn và không phải viết mã vô dụng. –
@Adriano Thay vì sao chép và làm lại, bạn không thể chỉ sử dụng 'ném;'? Điều đó giữ dấu vết ngăn xếp ban đầu, phải không? – JSQuareD