Как я могу поймать все исключения, которые будут возникать при чтении и записи файла?


105

В Java есть ли способ получить (поймать) все, exceptionsа не поймать исключение по отдельности?


2
и я поймаю все эти конкретные исключения с помощью catch (Exception e) {} ??
Johanna

Да. Поскольку Exception является базовым классом всех исключений, он перехватит любое исключение.
jjnguy 02

1
@ jjnguy: спасибо за хорошее объяснение.
Johanna

Я рад, что это было полезно.
jjnguy 02

Ответы:


111

Если хотите, вы можете добавить в свои методы предложения throws. Тогда не обязательно сразу ловить проверенные методы. Таким образом, вы сможете поймать более exceptionsпозднее время (возможно, одновременно с другим exceptions).

Код выглядит так:

public void someMethode() throws SomeCheckedException {

    //  code

}

Позже вы сможете справиться с ними, exceptionsесли не хотите иметь дело с ними этим методом.

Чтобы перехватить все исключения, какой-то блок кода может выдать, вы можете сделать: (Это также поймает, что Exceptionsвы написали сами)

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.

}

Причина, по которой это работает, заключается в том, что Exceptionэто базовый класс для всех исключений. Таким образом, любое исключение, которое может быть сгенерировано, обозначается Exceptionбуквой E в верхнем регистре.

Если вы хотите сначала обработать свои собственные исключения, просто добавьте catchблок перед общим Exception.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}

95

Хотя я согласен с тем, что перехватывать необработанное исключение - не лучший стиль, существуют способы обработки исключений, которые обеспечивают превосходное ведение журнала и возможность обрабатывать неожиданные ситуации. Поскольку вы находитесь в исключительном состоянии, вы, вероятно, больше заинтересованы в получении хорошей информации, чем во времени ответа, поэтому производительность instanceof не должна иметь большого успеха.

try{
    // IO code
} catch (Exception e){
    if(e instanceof IOException){
        // handle this exception type
    } else if (e instanceof AnotherExceptionType){
        //handle this one
    } else {
        // We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
        throw e;
    }
}

Однако при этом не учитывается тот факт, что ввод-вывод также может вызывать ошибки. Ошибки - не исключения. Ошибки относятся к другой иерархии наследования, чем исключения, хотя оба имеют общий базовый класс Throwable. Поскольку ввод-вывод может генерировать ошибки, вы можете пойти еще дальше и поймать Throwable

try{
    // IO code
} catch (Throwable t){
    if(t instanceof Exception){
        if(t instanceof IOException){
            // handle this exception type
        } else if (t instanceof AnotherExceptionType){
            //handle this one
        } else {
            // We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else if (t instanceof Error){
        if(t instanceof IOError){
            // handle this Error
        } else if (t instanceof AnotherError){
            //handle different Error
        } else {
            // We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else {
        // This should never be reached, unless you have subclassed Throwable for your own purposes.
        throw t;
    }
}

12
Почему бы не использовать несколько блоков catch?
Carl G

1
Я бы сказал, что вы должны явно перехватывать каждое исключение, но вопрос явно спрашивал, как перехватить все, что вызовет блок кода.
codethulhu

Этот метательный предмет был полезен.
Аншул

Это решение, которое я искал, мне нужно было if else для обработки исключений. Спасибо
CubeJockey

Метательный наконечник действительно пригодится.
Cherryhitech

15

Поймать базовое исключение Exception

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }

8
Если вы пишете этот код, вы почти наверняка делаете что-то ужасно неправильно.
Джордж

2
@ Джордж, почему ты так сказал?
kuchi

10
@George Не обязательно, если вы имеете дело с чем-то, у которого есть много конфиденциальных параметров ввода, и очень сложно проверить действительность каждого из них, перехват всех видов исключений после того, как рабочие случаи правильно протестированы, - это путь . Это сделает код ясным и менее утомительным, чем огромное и потенциально тяжелое состояние.
Johnride

2
Большинство программистов, с которыми я работал, ничего не вкладывают в свои операторы catch, поэтому использование этого фрагмента try catch на самом деле лучше, чем перехват нескольких различных типов исключений и ничего с ними не делать
Лу Морда

1
@LouisMorda Я не согласен, перехват каждого подкласса Exception и не делать ничего на его основе (игнорировать их) хуже, чем просто перехватить некоторые конкретные исключения и игнорировать их. Если вы поймаете некоторые типы исключений и ничего не сделаете с информацией, у вас нет шансов узнать, что пошло не так в этих ситуациях, но если вы поймаете все подклассы Exception, у вас нет шансов узнать, что пошло не так в очень большом количестве ситуаций. Подумайте, как вы будете обрабатывать отчеты об ошибках без информации из исключений, такой как трассировки стека и сообщения.
zpon

6

Поймать исключение - плохая практика - оно слишком широко, и вы можете пропустить что-то вроде исключения NullPointerException в собственном коде.

Для большинства файловых операций исключение IOException является корневым исключением. Лучше поймать это вместо этого.


1
Поймать исключение - плохая практика. Зачем? отрицательный голос объяснил плохо
Педро Секейра

4

Да, есть.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}

4

Вы можете поймать несколько исключений в одном блоке catch.

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 

3

Вы имеете в виду перехватить выброс Exceptionлюбого типа , а не только определенные исключения?

Если так:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}

Что делать с не конкретными?
Johanna

и я поймаю все эти конкретные исключения с помощью catch (Exception e) {} ??
Johanna
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.