2012-02-14 46 views
39

Tôi có một đoạn mã cố gắng nắm bắt:Làm thế nào để xác định xem một ngoại lệ là một loại đặc biệt

try 
{ 
    ... 
} 
catch(Exception ex) 
{ 
    ModelState.AddModelError(
     "duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique"); 
} 

Đối với đoạn mã này tôi đang cố gắng để chèn một bản ghi vào cơ sở dữ liệu: Các dba có thiết lập nó để cơ sở dữ liệu kiểm tra các bản sao và trả về một lỗi nếu có các bản sao. Hiện tại, như bạn có thể thấy, tôi đang thêm cùng một lỗi vào mô hình bất kể lỗi nào xảy ra. Tôi muốn nó thay đổi để lỗi này chỉ được thêm vào mô hình nếu nó được gây ra bởi lỗi trùng lặp được thiết lập bởi dba.

Dưới đây là lỗi tôi muốn bắt. Lưu ý nó trong ngoại lệ bên trong. Bất cứ ai có thể cho tôi biết làm thế nào để đặc biệt bắt này?

enter image description here

+0

Xem Davide của. Nói chung bắt 'Ngoại lệ' không phải là cách hay nhất. Bạn nên càng cụ thể càng tốt và để bất cứ điều gì bạn không thể xử lý bong bóng lên đến người dùng/khung. – Ryan

+1

Kiểm tra câu trả lời này: http://stackoverflow.com/questions/3967140/c-sharp-entity-framework-duplicate-unique-exception –

Trả lời

75

trước bắt hiện tại của bạn thêm dòng sau:

catch(DbUpdateException ex) 
{ 
    if(ex.InnerException is UpdateException) 
    { 
    // do what you want with ex.InnerException... 
    } 
} 
-1

Bạn có thể có một cái nhìn tại các lớp SQLException - và kiểm tra về nội dung của thông điệp của ngoại lệ nếu nó chứa những gì bây giờ bạn thấy trong ngoại lệ bên trong của bạn..Một cái gì đó như thế này:

try 
{ 
    //your code here 
} 
catch (SQLException ex) 
{ 
    if (ex.Message.Contains("Cannot insert duplicate key in obj....")) 
    { 
     //your code here 
    } 
} 
+1

tôi nghi ngờ rằng SqlException được ném trực tiếp, nhưng chỉ như là một ngoại lệ bên trong . Ngoài ra, nó có lẽ sẽ là tốt hơn để kiểm tra số lỗi thay vì so sánh với văn bản tin nhắn. –

+0

Yup, bạn cũng có thể kiểm tra số lỗi. Cảm ơn bạn đã bình luận. –

+0

Làm cách nào để bạn kiểm tra số lỗi? Tôi thậm chí không chắc số của nó là vì nó là một lỗi thực sự cụ thể? – AnonyMouse

8

Thay thế System.Threading.ThreadAbortException bằng ngoại lệ của bạn.

try 
{ 
    //assume ThreadAbortException occurs here 
} 
catch (Exception ex) 
{ 
    if (ex.GetType().IsAssignableFrom(typeof(System.Threading.ThreadAbortException))) 
    { 
     //what you want to do when ThreadAbortException occurs   
    } 
    else 
    { 
     //do when other exceptions occur 
    } 
} 
0

làm yo nghĩa

catch (Exception e){ 
    if (e.GetType() == XyzException) 
    //if (e.GetType().ToString() == "XyzException") 
    //if (e.GetType().Name == .....) 
} 
0

Để có được tên của ngoại lệ, bạn có thể sử dụng câu trả lời

catch (Exception exc){ 
     if (exc.GetType().FullName == "Your_Exception") 
     { 
      // The same can be user for InnerExceptions 
      // exc.InnerException.GetType().FullName 
     } 
    } 
Các vấn đề liên quan