2010-03-04 43 views
14

Tôi không thể tìm thấy toán tử "không phải" trong C#. Ví dụ tôi có mã bên dưới không hoạt động. Tôi cần kiểm tra rằng err không thuộc loại lớp ThreadAbortException.KHÔNG phải là toán tử KHÔNG trong C#

catch (Exception err) 
    { 
     if (err is not ThreadAbortException) 
     { 
     } 
    } 
+0

Cảm ơn bạn, câu trả lời cả hai đều làm việc;) – Tomas

+0

Bạn có thể làm điều này: Nếu Không object.ReferenceEquals (err.GetType(), GetType (ThreadAbortException)) Sau đó –

Trả lời

35

Chỉ cần thay đổi khối catch để:

catch(ThreadAbortException ex) 
{ 
} 
catch(Exception ex) 
{ 
} 

vì vậy bạn có thể xử lý ThreadAbortExceptions và tất cả những người khác một cách riêng biệt.

+1

Đây là giải pháp tốt hơn cho tình hình hiện tại. +1 –

+2

Whew, đã gần rồi. Tôi ghét nhìn thấy '! (A là B)' ở bất cứ đâu! – ChaosPandion

+0

Nhìn vào đoạn mã trong câu hỏi thực sự làm tôi bối rối, đó là nếu tôi quên làm thế nào để bắt ngoại lệ. Đây là cách thực sự đúng. – Finglas

33

Trong trường hợp này, quấn và kiểm tra ngược boolean:

if (!(err is ThreadAbortException)) 
+0

1: Đây là cách thông thường, nhưng bắt khối có một cách tốt hơn. – Richard

2

Bạn sẽ có thể làm điều gì đó như thế này:

catch (Exception err){ 
    if (!(err is ThreadAbortException)) { 
    //Code 
    } 
} 
+0

Một lý do bạn có thể muốn loại trừ các loại ngoại lệ riêng biệt là bạn có thể sử dụng một khối 'cuối cùng' khác nhau trên từng loại ngoại lệ. Có lẽ một số ngoại lệ không thể khôi phục được (bạn dọn sạch tài nguyên của mình trong khối cuối cùng nếu những ngoại lệ này xảy ra) trong khi những ngoại lệ khác có thể phục hồi được (bạn để nguyên tài nguyên và cho phép người gọi sắp xếp tài nguyên). –

7

Hơn khả năng những gì bạn nên làm gì trong trường hợp này là:

try 
{ 
    // Do Something 
} 
catch (ThreadAbortException threadEx) 
{ 
    // Do something specific 
} 
catch (Exception ex) 
{ 
    // Do something more generic 
} 

Bạn có thể có nhiều catch khối cho một try . Luôn đảm bảo sắp xếp chúng sao cho giá trị cụ thể nhất ở trên cùng và nhất là (catch (Exception ex)) là cuối cùng vì thứ tự tra cứu từ trên xuống dưới, vì vậy nếu bạn đặt catch (Exception ex) trước, nó sẽ luôn là thứ duy nhất chạy.

1

Lee có câu trả lời hay nhất.

Chỉ cần thêm, bạn nên luôn luôn bắt được từ cụ thể nhất xuống mức chung nhất. Trong trường hợp của bạn, ThreadAbortException là cách cụ thể nhất để giải quyết vấn đề đó trước tiên.

2

Có lẽ bạn đang tìm kiếm này:

if(err.GetType() != typeof(ThreadAbortException)) 
{ 

} 

Nhưng tôi mạnh khuyên sử dụng một lệnh catch riêng biệt, theo đề nghị của Lee.

catch(ThreadAbortException ex) 
{ 

} 
catch(Exception ex) 
{ 

}