2009-08-20 22 views
9

Có hợp pháp và an toàn trong C# để bắt ngoại lệ trên một chuỗi và sau đó ném lại nó lên một chuỗi khác.Bạn có thể rút lại ngoại lệ .NET trên một chuỗi khác không?

Ví dụ: là điều này hợp pháp

Exception localEx = null; 

Thread mythread = new Thread() {() => 
        { 
         try 
         { 
          DoSomeStuff(); 
         } 
         catch(Exception ex) 
         { 
          localEx = ex; 
         } 
        }); 

myThread.Start(); 
... 
myThread.Join(); 

if(localEx != null) 
    throw localEx; // rethrow on the main thread 

Tôi nghĩ rằng đó là hợp pháp, nhưng tôi đang gặp khó khăn khi tìm bất kỳ tài liệu nào chứng minh điều đó. Gần nhất tôi tìm thấy là một đề cập ngắn gọn về việc chuyển ngoại lệ giữa các chủ đề tại đây: http://msdn.microsoft.com/en-us/library/ms229005.aspx

+0

Bạn có thể chuyển đối tượng từ chuỗi này sang chủ đề khác không? – Partial

+0

@Partial: tất nhiên bạn có thể. –

Trả lời

11

Vâng, đó là hợp pháp. Ngoại lệ là (nói chung) các đối tượng mô tả không có ái lực luồng.

Bạn muốn được tốt hơn gói ngoại lệ chủ đề của bạn trong một ngoại lệ mới:

throw new Exception("Something descriptive here", localEx); 

Bằng cách đó, stack trace trong localEx sẽ được duy trì (tùy theo từng InnerException của ngoại lệ mới).

+1

-1: Bạn có định thêm một trích dẫn không? Nếu vậy, tôi sẽ upvote sau đó. –

+0

Câu trả lời của bạn là "có, nó hợp pháp". Tôi nghĩ nhiều hơn là cần thiết hơn thế. Bạn đã mở rộng câu trả lời của bạn đến điểm mà downvote là không cần thiết. –

+0

Cảm ơn bạn đã chỉ ra điều đó. Tôi sẽ làm nó. –

2

Tôi không thấy lý do tại sao nó không hoạt động, nhưng bạn cần phải nhớ rằng bạn không thực sự rethrowing ngoại lệ. Bạn đang ném một ngoại lệ mới, mà chỉ xảy ra là cùng một đối tượng ngoại lệ. Vì vậy, ví dụ, theo dõi ngăn xếp sẽ nói rằng nó đã được ném từ "ném localEx;" thay vì bất cứ nơi nào ngoại lệ ban đầu đến từ.

+0

Cảm ơn. Vâng, suy nghĩ lại là từ sai. Tôi sẽ sử dụng localEx như là ngoại lệ bên trong để tránh vấn đề ngăn xếp cuộc gọi mà bạn đề cập đến. –

3

Những gì bạn đang làm không phải là một sự cải tiến. Đó là một ném mới của một trường hợp ngoại lệ bạn đã xảy ra trong một biến. Ngay cả khi bạn đang sử dụng chỉ một chủ đề duy nhất, đây sẽ là một ý tưởng tồi, vì nó làm cho ngoại lệ trông giống như nó đến từ trang web "ném". Với nhiều chủ đề, tôi không có ý tưởng làm thế nào bất cứ ai sẽ tìm ra đã có một sự thay đổi thread.

2

Nó là hợp pháp và nó không phải là một rethrow, đó là một ngoại lệ mới bị ném vào thread khác (với đối tượng ngoại lệ tương tự)

3

Chắc chắn rồi. System.AggregateException được thêm vào .NET 4 cho mục đích cụ thể trong các hoạt động song song.

0

Tôi không biết tại sao bạn cho rằng nó không hợp pháp. Nếu nó là bất hợp pháp chắc chắn trình biên dịch sẽ bắt hoặc thời gian chạy sẽ ném một ngoại lệ. Như một vấn đề của thực tế tôi sử dụng mô hình này. @John Trong một ứng dụng biểu mẫu cửa sổ gọi các dịch vụ web bằng chủ đề nền tôi sử dụng theo cách này. Ngoại lệ sau đó được xử lý trong trình xử lý cấp cao nhất của Application.ThreadException, đã đăng nhập, vv. Không cần thiết phải biết rằng trong đó luồng ngoại lệ xảy ra.

Các vấn đề liên quan