Поймать определенное исключение WebException (550) - PullRequest
7 голосов
/ 23 марта 2009

Допустим, я создаю и выполняю System.Net.FtpWebRequest.

Я могу использовать catch (WebException ex) {} для перехвата любого исключения, связанного с сетью, которое выдается этим запросом. Но что, если у меня есть какая-то логика, которую я хочу выполнить, только когда выдается исключение из-за (550) file not found?

Какой лучший способ сделать это? Я мог бы скопировать сообщение об исключении и проверить на равенство:

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

Но теоретически кажется, что это сообщение может измениться в будущем.

Или я мог бы просто проверить, содержит ли сообщение об исключении «550». Этот подход, вероятно, с большей вероятностью сработает, если сообщение будет изменено (оно, вероятно, все еще будет содержать «550» где-то в тексте). Но, конечно, такой тест также вернул бы true, если текст для некоторого другого WebException просто содержит «550».

Кажется, что нет способа получить доступ только к номеру исключения. Это возможно?

Ответы [ 3 ]

14 голосов
/ 23 марта 2009

WebException предоставляет свойство StatusCode, которое вы можете проверить.

Если вам нужен реальный код ответа HTTP, вы можете сделать что-то вроде этого:

(int)((HttpWebResponse)ex.Response).StatusCode
3 голосов
/ 24 марта 2009

Для справки, вот фактический код, который я использовал в итоге:

catch (WebException ex) {
    if (ex.Status == WebExceptionStatus.ProtocolError &&
        ((FtpWebResponse)ex.Response).StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) {
        // Handle file not found here
    }
0 голосов
/ 23 марта 2009

Объявите объект WebException, приведя к нему значение ex из вашего блока Catch. Затем вы можете проверить свойство StatusCode.

...