2009-03-23 20 views
7

Giả sử tôi tạo và thực hiện một System.Net.FtpWebRequest.Bắt một WebException cụ thể (550)

Tôi có thể sử dụng catch (WebException ex) {} để xem bất kỳ ngoại lệ nào liên quan đến web được gửi bởi yêu cầu này. Nhưng nếu tôi có một số logic mà tôi chỉ muốn thực hiện khi ngoại lệ được ném do (550) file not found?

Cách tốt nhất để làm điều này là gì? Tôi có thể sao chép thông báo ngoại lệ và kiểm tra tính bình đẳng:

const string fileNotFoundExceptionMessage = 
    "The remote server returned an error: (550) File unavailable (e.g., file not found, no access)."; 
if (ex.Message == fileNotFoundExceptionMessage) { 

Nhưng về mặt lý thuyết, dường như thông báo này có thể thay đổi trên đường.

Hoặc, tôi chỉ có thể kiểm tra xem thông báo ngoại lệ có chứa "550" hay không. Cách tiếp cận này có thể có khả năng hoạt động tốt hơn nếu thông báo được thay đổi (nó có thể vẫn chứa "550" ở đâu đó trong văn bản). Nhưng tất nhiên thử nghiệm như vậy cũng sẽ trả về true nếu văn bản cho một số khác WebException chỉ xảy ra có chứa "550".

Có vẻ như không phải là phương pháp để truy cập chỉ số của ngoại lệ. Điều này có thể không?

Trả lời

14

WebException cho thấy thuộc tính StatusCode mà bạn có thể kiểm tra.

Nếu bạn muốn mã phản hồi HTTP thực tế bạn có thể làm một cái gì đó như thế này:

(int)((HttpWebResponse)ex.Response).StatusCode 
-1

Khai báo một đối tượng WebException, đúc các giá trị cũ từ khối Catch của bạn với nó. Sau đó, bạn có thể kiểm tra thuộc tính StatusCode.

+0

Bắt một 'WebException' sẽ chỉ cung cấp cho bạn một' Status' của ** ProtocolError **. Bạn cần phải cast ex.Response vào một HttpWebResponse như trong câu trả lời ở trên để lấy mã mong muốn (ví dụ: 404, 500). – ProKiner

3

Để tham khảo, đây là đoạn code thực tế tôi đã kết thúc bằng:

catch (WebException ex) { 
    if (ex.Status == WebExceptionStatus.ProtocolError && 
     ((FtpWebResponse)ex.Response).StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) { 
     // Handle file not found here 
    } 
Các vấn đề liên quan