web-dev-qa-db-fra.com

Lancer des exceptions personnalisées en Java / Android

Je développe une classe d'exception personnalisée, dans laquelle j'ai les constructeurs suivants:

public class UserException extends Exception
{
    string message;
    public UserException() {
        super();
    }

    public UserException(String message, Throwable cause)
    {
        super(message, cause);

        this.cause = cause;
        this.message = message;
    }
}

Et je crée une nouvelle exception personnalisée comme celle-ci:

private Camera.PreviewCallback SetPreviewCallBack() throws UserException {
    .......
    // Something went wrong
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
 }

Mais quand j'insère ma throw new UserException(...) cela me dit de l'entourer de try/catch !! Ce n'est pas l'idée, n'est-ce pas? Je veux lancer des exceptions personnalisées lorsque j'ai besoin qu'elles soient levées, sans entourer mes new Exceptions De plusieurs clauses try/catch.

Alors, qu'est-ce que je fais mal? Qu'est-ce que je comprends mal?

15
Sonhja

En plus de la réponse d'Eran, vous pouvez également étendre votre exception personnalisée RuntimeException, qui n'a pas besoin d'être interceptée.

19
DennisW

Si la méthode qui lève cette exception ne la gère pas (c'est-à-dire qu'elle ne l'attrape pas), elle doit la déclarer dans la clause throws, car il s'agit d'une exception vérifiée.

public void yourMethod () throws UserException
{
    ...
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
    ...
}
9
Eran

si votre exception personnalisée s'étend de la classe Exception , elle doit être gérée (à l'aide de try-catch) ou transmis à l'appelant (en utilisant throws). Si vous voulez simplement le laisser à l'exécution pour gérer l'exception, vous devez l'étendre à partir de RuntimeException Class Puisque c'est le 1er cas dans votre scénario, vous devriez faire quelque chose comme ceci:

public void surroundingMethod() throws UserException{
    throw new UserException("Something failed.", new Throwable(String.valueOf(UserExceptionType.CaptureFailed)));
}

cela passera essentiellement votre exception à l'appelant, donc maintenant il sera de la responsabilité de l'appelant de le gérer avec try-catch ou de le transmettre à nouveau.

là encore, vous devez modifier l'instruction d'appel comme

public void callingMethod () {
    try {
        surroundingMethod();
    } catch (UserException ex){
    }
}
6
Ankit

Vous devez soit déclarer vos méthodes comme throws UserException - ou faites étendre votre exception RuntimeException .

Ce dernier n'est officiellement pas conseillé, mais est souvent utilisé pour contourner le mécanisme d'exception déclaré de Java .

3
amit

En Java, lorsque vous throw a avez coché Exception, vous devez faire encore une chose:

1. Soit ajoutez un try-catch bloquer autour de throw et gérer ce Exception dans la même méthode.

2. Ou ajoutez une instruction throws à la définition de la méthode, transférant la responsabilité de la gestion du Exception à une méthode de niveau supérieur.

Cela fait partie des paradigmes globaux OOP de modularité et d'abstraction: qui est responsable de la gestion d'un Exception, de l'appelant d'une méthode ou de la méthode elle-même? La réponse dépend de la nature du Exception.

2
Y.S