2009-03-23 8 views
7

Supposons que je crée et exécute un System.Net.FtpWebRequest.Attraper une WebException spécifique (550)

Je peux utiliser catch (WebException ex) {} pour intercepter toute exception Web liée à cette demande. Mais que faire si j'ai une logique que je veux seulement exécuter quand l'exception est levée en raison de (550) file not found?

Quelle est la meilleure façon de faire cela? Je pourrais copier le message d'exception et d'essai pour l'égalité:

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

Mais théoriquement, il semble que ce message pourrait changer sur la route. Ou, je pourrais simplement tester si le message d'exception contient "550". Cette approche est probablement plus susceptible de fonctionner si le message est modifié (il contiendra probablement encore "550" quelque part dans le texte). Mais bien sûr, un tel test retournerait aussi vrai si le texte d'un autre WebException contient justement "550".

Il ne semble pas exister de méthode pour accéder uniquement au numéro de l'exception. Est-ce possible?

Répondre

14

WebException expose une propriété StatusCode que vous pouvez vérifier.

Si vous voulez que le code de réponse HTTP réel que vous pouvez faire quelque chose comme ceci:

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

Déclarez un objet WebException, jetant la valeur de votre ex bloc Catch à lui. Ensuite, vous pouvez vérifier la propriété StatusCode.

+0

Attraper un 'WebException' seulement vous donner un' status' de ** ProtocolError **. Vous devez convertir la réponse ex à une réponse HttpWeb comme dans la réponse ci-dessus pour obtenir le code souhaité (c.-à-d. 404, 500). – ProKiner

3

Pour référence, voici le code actuel, je fini par utiliser:

catch (WebException ex) { 
    if (ex.Status == WebExceptionStatus.ProtocolError && 
     ((FtpWebResponse)ex.Response).StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) { 
     // Handle file not found here 
    } 
Questions connexes