В Java существует два вида исключений: проверено и не проверено. Существует большая дискуссия о том, какой из них лучше использовать, оба аргумента хороши.
По сути, исключение Checked является производным от java.lang.Exception
и требует, чтобы, если вы не указали свой метод как «throws MyCheckedException», вы должны перехватить и обработать исключение в вашем методе.
// throw the exception
void foo() throws MyCheckedException
{
throw new MyCheckedException();
}
// or handle the exception
void foo()
{
try {
throw new MyCheckedException();
} catch (MyRuntimeException e) {
e.printStackTrace();
}
}
Исключение Unchecked, полученное из java.lang.RuntimeException
, не требует, чтобы вы указывали «throws» в определении вашего метода или обрабатывали его.
void foo()
{
throw new MyUncheckedException();
}
Преимущество Checked заключается в том, что компилятор предупредит вас, если вы не обработали исключение.
Недостатком является то, что вы должны объявлять блок try / catch или throws для каждого исключения Checked, и код верхнего уровня может стать довольно громоздким, пытаясь обработать все различные типы исключений.
По этой причине, если вы осторожны, вы можете предпочесть использование непроверенных исключений.
Кстати, вы можете выбрать тип исключения только тогда, когда определите свой собственный.
При обнаружении исключений из Java или сторонней библиотеки вы должны решить, как с этим справиться. например Если сторонний метод выбрасывает CheckedException1, то вы должны либо обработать его, либо объявить вызывающий метод как «throws CheckedException1». Если вы хотите избежать использования проверенных исключений, вы можете заключить их в исключение непроверенных и выбросить их.
void foo() // no throws declaration
{
try {
thirdPartyObj.thirdPartyMethod(); // this throws CheckedException1
}
catch (CheckedException1 e) {
throw new MyUncheckedException(e); // this will wrap the checked in an unchecked.
}
}
Обратите внимание, что вы можете вызвать исключение Unchecked без объявления throws. Чтобы получить доступ к исходному CheckedException1 сверху вниз, вы можете использовать метод .getCause () вашего исключения Unchecked.
void caller()
{
try {
foo();
} catch (MyUncheckedException e) {
CheckedException1 ce1 = e.getCause();
ce1.printStackTrace();
}
}
... но поскольку исключение из foo () не проверено, у вас нет для его обработки или объявления "throws".
Что касается лесозаготовок, по этому поводу существуют разные школы мысли.
- Записать его при возникновении исключения (низкий уровень)
- Записать, когда достигнет вершины (высокий уровень)
- Записывайте его, когда у вас достаточно информации для выполнения соответствующего действия и / или сообщения журнала. (средний уровень)
Хорошая политика, которую я нашел, - это установить обработчик необработанных исключений, который позаботится обо всех необработанных (явно не проверенных) исключениях. Таким образом, все пропущенное будет зарегистрировано и, возможно, обработано до сбоя системы.
public class MyExceptionHandler implements UncaughtExceptionHandler
{
@Override
public void uncaughtException(Thread thread, Throwable ex)
{
ex.printStackTrace();
}
}
// In your high-level code
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
и все для Исключений, которые могут быть обработаны изящно, перехватите и обработайте их в модуле, где вы достаточно знаете о ситуации, чтобы, возможно, исправить проблему и попробуйте снова.