2011-08-01 27 views
13
try 
{ 
    object result = processClass.InvokeMethod("Create", methodArgs); 
} 
catch (Exception e) 
{ 
    // Here I was hoping to get an error code. 
} 

Khi tôi gọi phương thức WMI ở trên, tôi dự kiến ​​sẽ bị Truy cập bị từ chối. Trong khối catch của tôi, tôi muốn chắc chắn rằng ngoại lệ đã được thực sự cho Access Denied. Có cách nào tôi có thể nhận được mã lỗi cho nó? Mã lỗi Win32 cho Acceess bị từ chối là 5. Tôi không muốn tìm kiếm thông báo lỗi cho chuỗi bị từ chối hoặc bất kỳ thứ gì như thế.Cách lấy Mã lỗi ngoại lệ trong C#

Cảm ơn

+1

Chạy mã, đặt điểm ngắt trong khối catch của bạn và sử dụng trình gỡ lỗi để xem ngoại lệ và xem bạn có thông tin gì. –

+0

Ngoài ra, bạn có thể chạy mã mà không cần phải gỡ rối và in ra loại Ngoại lệ với GetType(). Nhưng câu trả lời của Joel cũng sẽ làm điều này. – KyleM

+0

Bạn chỉ nên nắm bắt loại ngoại lệ chính xác mà bạn mong đợi; bắt 'ngoại lệ' gần như luôn luôn là một mùi mã xấu. – Bevan

Trả lời

26

thử này để kiểm tra ngoại lệ và các nội một cho một Win32Exception derived exception.

catch (Exception e){ 
    var w32ex = e as Win32Exception; 
    if(w32ex == null) { 
     w32ex = e.InnerException as Win32Exception; 
    }  
    if(w32ex != null) { 
     int code = w32ex.ErrorCode; 
     // do stuff 
    }  
    // do other stuff 
} 

Như trong các ý kiến, bạn thực sự cần phải xem những gì ngoại lệ được thực sự bị ném để hiểu những gì bạn có thể làm, và trong trường hợp đó, một bắt cụ thể được ưa thích hơn là chỉ bắt ngoại lệ. Một cái gì đó như:

catch (BlahBlahException ex){ 
     // do stuff 
    } 

Cũng System.Exception has a HRESULT

catch (Exception ex){ 
    int code = ex.HResult; 
} 
+0

Vì câu hỏi này khá cũ, đây chỉ là lời nhắc cho những người muốn sử dụng câu trả lời này: Đối với .NET 3.0, 3.5 và 4.0, bạn sẽ phải sử dụng sự phản chiếu để lấy giá trị của thuộc tính HResult vì nó được đánh dấu được bảo vệ. Nguồn: http://stackoverflow.com/questions/15462675/how-can-i-get-the-error-number-instead-of-error-message-in-an-exception-in-c – curiousBoy

4

Bạn nên nhìn vào các thành viên của ném ngoại lệ, đặc biệt là .Message.InnerException.

Tôi cũng sẽ xem liệu tài liệu cho InvokeMethod có cho bạn biết liệu nó có ném một số lớp ngoại lệ chuyên biệt hơn ngoại lệ - chẳng hạn như Win32Exception do @Preet đề xuất. Việc bắt và chỉ nhìn vào lớp cơ sở Ngoại lệ có thể không đặc biệt hữu ích.

1

tôi đề nghị bạn sử dụng tin nhắn Properte từ The Exception Object Giống như mã dưới đây

try 
{ 
object result = processClass.InvokeMethod("Create", methodArgs); 
} 
catch (Exception e) 
{ 
    //use Console.Write(e.Message); from Console Application 
    //and use MessageBox.Show(e.Message); from WindowsForm and WPF Application 
} 
1

xây dựng trên giải pháp Preet Tăng của, sau đây nên bao gồm một cách an toàn các kịch bản mà bạn đang làm việc với một giải pháp lớn với tiềm năng cho một số ngoại lệ bên trong.

try 
{ 
    object result = processClass.InvokeMethod("Create", methodArgs); 
} 
catch (Exception e) 
{ 
    // Here I was hoping to get an error code. 
    if (ExceptionContainsErrorCode(e, 10004)) 
    { 
     // Execute desired actions 
    } 
} 

...

private bool ExceptionContainsErrorCode(Exception e, int ErrorCode) 
{ 
    Win32Exception winEx = e as Win32Exception; 
    if (winEx != null && ErrorCode == winEx.ErrorCode) 
     return true; 

    if (e.InnerException != null) 
     return ExceptionContainsErrorCode(e.InnerException, ErrorCode); 

    return false; 
} 

Mã này đã được đơn vị kiểm tra.

Tôi sẽ không harp quá nhiều về nhu cầu để đánh giá cao và triển khai thực hành tốt khi nói đến Xử lý ngoại lệ bằng cách quản lý từng Loại ngoại lệ được mong đợi trong các khối của riêng họ.

+0

Cải thiện nhỏ trong C# 6, bạn có thể thay đổi câu lệnh if đầu tiên của mình thành dòng dưới cùng. Phần đầu tiên kiểm tra null, và thất bại nếu điều kiện khi 'winEx == null'. Sau đó, nó kiểm tra một cách an toàn thuộc tính 'ErrorCode' mà không cần ném một ngoại lệ null. 'if (winEx? .ErrorCode == ErrorCode)' –

0

Một phương pháp khác là lấy mã lỗi trực tiếp từ lớp ngoại lệ. Ví dụ:

catch (Exception ex) 
{ 
    if (ex.InnerException is ServiceResponseException) 
     { 
     ServiceResponseException srex = ex.InnerException as ServiceResponseException; 
     string ErrorCode = srex.ErrorCode.ToString(); 
     } 
} 
Các vấn đề liên quan