2008-10-08 22 views
13

Trong VB.NET tôi thường Catch…When:C# tương đương với Catch VB.NET của ... Khi

Try 
    … 
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES" 
    … 
End Try 

Có C# tương đương với Catch…When?

Tôi không muốn sử dụng câu hỏi if bên trong một catch nếu có thể.

+0

Kiểm tra trang này http://stackoverflow.com/questions/4269189/c-exception-monitor-with-filtering;) – Edward83

Trả lời

12

Chức năng này đã được công bố cho C# 6. Nó bây giờ có thể viết

try { … } 
catch (MyException e) when (myfilter(e)) 
{ 
    … 
} 

Bạn có thể tải về bản xem trước của Visual Studio 2015 nay đến kiểm tra này ra, hoặc chờ đợi cho việc phát hành chính thức.

15

Không có tương đương với Catch…When trong C#. Bạn sẽ thực sự phải dùng đến một tuyên bố if bên catch của bạn, sau đó rethrow nếu tình trạng của bạn không được thoả mãn:

try 
{ 
    … 
} 
catch (ArgumentNullException e) 
{ 
    if ("SAMPLES" == e.ParamName.ToUpper()) 
    { 
     … // handle exception 
    } 
    else 
    { 
     throw; // condition not fulfilled, let someone else handle the exception 
    } 
} 
+2

Tôi đang sử dụng tàu tuần dương và Nicholas Mancuso, chỉ cần sử dụng 'ném' bảo tồn Ngăn xếp [Lỗi lầm Mỗi C ​​# Lập trình viên làm cho] (http://msmvps.com/blogs/nickwienholt/archive/2006/07/04/103778.aspx "Các sai lầm Mỗi C ​​# Lập trình làm cho") – bob31334

+0

@ bob31334 Chỉ ngăn xếp được chụp trong đối tượng ngoại lệ, tuy nhiên trạng thái của chương trình đã được sửa đổi và ngăn xếp ban đầu bị phá hủy, và cuối cùng khối đã được thực hiện (nói cách khác khi bộ lọc chạy trên mức câu lệnh khai thác chứ không phải trong trình xử lý, điều này tương tự như SEH trong API win32) –

12

Điều đó sẽ không tái tạo ngữ nghĩa giống như Catch VB Khi biểu. Có một sự khác biệt chính. VB Khi biểu thức được thực hiện trước khi ngăn xếp thư giãn xảy ra. Nếu bạn đã kiểm tra ngăn xếp tại điểm của một khi Bộ lọc, bạn sẽ thực sự thấy khung nơi ngoại lệ được ném.

Có một nếu trong khối catch là khác nhau bởi vì khối catch thực hiện sau khi ngăn xếp là unwound. Điều này đặc biệt quan trọng khi nói đến báo cáo lỗi. Trong kịch bản VB, bạn có khả năng gặp sự cố với một dấu vết ngăn xếp bao gồm cả lỗi. Không thể có được hành vi đó trong C#.

EDIT:

Đã viết một detailed blog post về đề tài này.

+0

bạn có chắc không? bạn chỉ có thể sử dụng 'ném'; thay vì 'ném e;' –

+0

100% Nó không liên quan gì đến việc ném. Đó là khi biểu thức được gọi khi được thực hiện. Trong VB nó sẽ xảy ra trong khi điểm nâng cao ngoại lệ vẫn còn trên stack. – JaredPar

+0

Trong C#, Ngay cả khi ngăn xếp được tải xuống - đối tượng Ngoại lệ 'e' vẫn có sẵn dấu vết ngăn xếp. nhưng nó có thể không hữu ích như có toàn bộ stack có sẵn tại thời gian gỡ lỗi. nhưng đối với thời gian chạy loggin thông tin stack trace sẽ đủ? – dotnetcoder