2014-07-24 1 views
0

J'ai recherché en ligne et recherché dans certains livres, mais les exemples donnés sont limités et j'ai encore quelques doutes dans l'exception définie par l'utilisateur.Mise en œuvre pour l'exception définie par l'utilisateur

En utilisant les codes suivants à titre d'exemple:

//Conventional way of writing user-defined exception 
class IdException extends Exception 

{ 
    public IdException(String s) 
    { 
     super(s); 
    } 
} 

class Product 
{ 
    String id = new String(); 
    public Product(String _id) throws IdException 
    { 
     id = _id; 

     //Check format of id 
     if (id.length() < 5) 
      throw(new IdException(_id)); 
    } 
} 

Il semble que la manière classique d'écrire une exception définie par l'utilisateur est presque toujours le même. Dans le constructeur de l'exception définie par l'utilisateur, nous appelons toujours super(msg). Cela déclenche une question en moi: Si la plupart des exceptions sont mises en œuvre de cette façon, quelle différence y a-t-il entre toutes ces exceptions? Par exemple, je peux avoir plusieurs exceptions définies par l'utilisateur, mais toutes semblent faire la même chose sans aucune différence. Par exemple, je peux avoir plusieurs exceptions définies par l'utilisateur. (Il n'y a pas mise en œuvre dans ces exceptions, ce qui les rend le travail?)

Exemple:

class IdException extends Exception 
{ 
    public IdException(String s) 
    { 
     super(s); 
    } 
} 

class NameException extends Exception 
{ 
    public NameException(String s) 
    { 
     super(s); 
    } 
} 

class ItemException extends Exception 
{ 
    public ItemException(String s) 
    { 
     super(s); 
    } 
} 

Journaliste: ne devrait donc pas nous (par exemple) mettre en œuvre le contrôle de id à l'intérieur du classe d'exception? Si toutes les classes d'exception ne semblent pas faire la même chose (ou ne font rien).

Exemple de mise en œuvre du contrôle dans une exception:

class IdException extends Exception  { 
    public IdException(String s) 
    { 
     super(s); 
     //Can we either place the if-statements here to check format of id ? 
    } 
    //Or here ? 
} 

Répondre

1

Idéalement vous ne devriez pas mettre en œuvre votre logique métier à l'intérieur d'exception. Exception indique des informations sur le comportement exceptionnel. Et dans Custom Exception, vous pouvez personnaliser ces informations.

Trouvez le best practice pour écrire une exception personnalisée.

+0

C'est le point que je ne comprends pas. Si nous n'implémentons pas la logique dans les exceptions.Dans mon exemple, 'IdException',' NameException', & 'ItemException' tout semble faire la même chose. Alors, pourquoi mettons-nous encore en œuvre autant d'exceptions qui font la même chose? Merci. – user3437460

+0

@ user3437460 Le type des exceptions peut être réutilisé dans le code pour produire différentes branches pour différents types d'exceptions dans les blocs 'try {...} catch (...) {...}' (voir @ sp00ms answer) et vous pouvez créer un message formaté à partir des paramètres clés pour rendre le code 'throw' plus lisible et produire toujours un texte de message agréable et lisible (voir ma réponse). – AlexR

+0

Les exceptions personnalisées sont des raisons de causes personnalisées. Dans chaque exception personnalisée, vous pouvez personnaliser vos informations de manière très spécifique. –

0

Nous avons tellement d'exceptions déjà définies dans java. Tous font la même chose: to notify user about the problem in code.

Supposons maintenant que nous ayons une seule exception, puis comment nous pouvons quelle erreur se produit lorsque l'exception est levée. Après tout, le nom compte beaucoup.

0

Pour prendre votre exemple des exceptions, je voudrais créer un message plus élaboré par formatage les données fournies:

public IdException(String id, String detail) { 
    super(String.format("The id \"%s\" is invalid: %s", id, detail)); 
} 

throw new IdException(_id, "Id too short."); 

De cette façon, il n'y a pas de réelle logique dans la classe IdException autre que de fournir la valeur donnée (id) et un message de détail ainsi que dans la chaîne e.getMessage() si le débogage et l'enregistrement est facile à lire et le code lui-même est aussi simple:

Il est somethi ng faux avec l'Id _id, à savoir c'est trop court. Ainsi nous le renvoyons à l'appelant.

Aussi, lorsque vous jetez différents types d'exceptions dans un code, il permet le code de l'appelant pour gérer chaque type d'exception différemment:

try { 
    getItem(id, name); 
} catch (IdException ex) { 
    fail(ex.getMessage()); // "The Id is bogus, I don't know what you want from me." 
} catch (NameException ex) { 
    warn(ex.getMessage()); // "The name doesn't match the Id, but here's the Item for that Id anyways" 
} catch (ItemException ex) { 
    fail("Duh! I reported to the dev, something happened"); 
    emailToAdmin(ex.getMessage()); // "The Item has some inconsistent data in the DB" 
}