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?
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.
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)));
...
}
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){
}
}
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 .
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
.