Как создать пользовательские исключения в Java?
Как создать пользовательские исключения в Java?
Ответ 1
Чтобы определить исключение checked, вы создаете подкласс (или иерархию подклассов) java.lang.Exception
. Например:
public class FooException extends Exception {
public FooException() { super(); }
public FooException(String message) { super(message); }
public FooException(String message, Throwable cause) { super(message, cause); }
public FooException(Throwable cause) { super(cause); }
}
Методы, которые потенциально могут вызывать или распространять это исключение, должны объявить его:
public void calculate(int i) throws FooException, IOException;
... и код, вызывающий этот метод, должен обрабатывать или распространять это исключение (или оба):
try {
int i = 5;
myObject.calculate(5);
} catch(FooException ex) {
// Print error and terminate application.
ex.printStackTrace();
System.exit(1);
} catch(IOException ex) {
// Rethrow as FooException.
throw new FooException(ex);
}
В приведенном выше примере вы заметите, что IOException
пойман и обновлен как FooException
. Это общий метод, используемый для инкапсуляции исключений (обычно при реализации API).
Иногда бывают ситуации, когда вы не хотите, чтобы каждый метод объявлял вашу реализацию исключений в своем предложении throw. В этом случае вы можете создать исключение unchecked. Исключением является исключение, которое распространяется на java.lang.RuntimeException
(который сам является подклассом java.lang.Exception
):
public class FooRuntimeException extends RuntimeException {
...
}
Методы могут вызывать или распространять исключение FooRuntimeException
без объявления его; например.
public void calculate(int i) {
if (i < 0) {
throw new FooRuntimeException("i < 0: " + i);
}
}
Необязательные исключения обычно используются для обозначения ошибки программиста, например передачи недопустимого аргумента методу или попытки нарушения границ индекса массива.
Класс java.lang.Throwable
является корнем всех ошибок и исключений, которые могут быть выбраны внутри Java. java.lang.Exception
и java.lang.Error
- оба подкласса Throwable
. Все, что подклассы Throwable
могут быть выброшены или пойманы. Тем не менее, как правило, неправильная практика заключается в том, чтобы ловить или бросать Error
, поскольку это используется для обозначения внутренних ошибок JVM, которые обычно не обрабатываются "программистом (например, OutOfMemoryError
). Аналогично вам следует избегать ловли Throwable
, что может привести к ловле Error
в дополнение к Exception
s.
Ответ 2
public class MyException extends Exception {
// special exception code goes here
}
Бросьте его как:
throw new MyException ("Something happened")
Поймать как:
catch (MyException e)
{
// something
}
Ответ 3
За проверенное исключение:
public class MyCustomException extends Exception { }
Технически, все, что распространяется на Throwable
, может быть брошено, но исключения обычно являются расширениями класса Exception
, так что они проверяют исключения (кроме RuntimeException или классов на его основе, которые не отмечены), поскольку противоположный другому распространенному типу throwable, Error
, который обычно не является чем-то предназначенным для изящного обращения за пределами внутренних элементов JVM.
Вы также можете делать исключения непубличными, но тогда вы можете использовать их только в пакете, который их определяет, в отличие от всех пакетов.
Что касается метаданных/улавливания пользовательских исключений, он работает так же, как и встроенные - бросьте через
throw new MyCustomException()
и поймать через
catch (MyCustomException e) { }