2010-12-01 26 views
1

Pourquoi le compilateur C# n'est pas assez intelligent dans le scénario suivant?Compilateur nécessitant une valeur de retour - Ne pas remarquer d'exception inconditionnelle dans la méthode appelée

void ThrowEx() { 
     throw new Exception(); 
    } 

    int Test() { 
     ThrowEx(); 
    } 

... Test(): tous les chemins de code renvoient une valeur

Edit: dans la pratique, je veux extraire la logique lancer exception dans une méthode distincte parce que je suis fatigué taper des choses comme throw new FaultException<MyCustomFault>(new MyCustomFault(), "cannot validate the input");

+2

Combien analyse que vous voulez le compilateur faire? À quelle profondeur devrait-il aller? –

+0

Pourquoi voudriez-vous cela? – Doggett

+0

La réponse simple est que c'est un compilateur pas un interprète – ChrisF

Répondre

3

Il ne regarde pas entre les méthodes; pas moins, la méthode pourrait être dans un assemblage différent et pourrait changer sans reconstruire, ou pourrait être virtuelle, extern, abstraite ou partielle - il serait déroutant de repérer seulement un petit nombre de cas.

Vous pourriez avoir le retour ThrowEx "int", puis:

return ThrowEx(); 

qui rendrait le compilateur heureux. Ou utiliser les médicaments génériques:

static T ThrowEx<T>() {...} 
... 
return ThrowEx<int>(); 
+0

Le problème avec les génériques est que je ne peux pas mettre "vide" au lieu de T – UserControl

+0

Bon point sur l'assemblage différent bien que dans mon cas c'est dans la même classe, c'est-à-dire aucune excuse pour le traducteur. – UserControl

+0

@UserControl - il suffit d'appeler et de supprimer: ThrowEx (); –

2

ThrowEx() est vide. Le compilateur le sait et détermine qu'il n'y a pas de valeur de retour pour la méthode Test(). Le compilateur est conçu pour tester votre production de méthode réussie. L'injection d'une exception levée en tant que réponse valide n'est pas une attente raisonnable du compilateur.

0

, entre autres, l'API Debugger ou Profiler peut permettre de jeter l'exception ThrowEx à sauter, à quel point le comportement de test serait défini.

1

Et comment voulez-vous que le compilateur pour traiter les cas tels que

void ThrowEx() { 
    decimal i = ... get 1 from app config; 
    decimal div = ... get 0 from app confid 
    decimal randomNumber = i/div; 
    do some other stuff.... 
} 

int Test() { 
    ThrowEx(); 
}