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

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

Таким образом, решение, которое я использую, состоит в том, чтобы заменить класс android.util.Log своим собственным классом Log:

public class Log {
    static final boolean LOG = false;

    public static void i(String tag, String string) {
        if (LOG) android.util.Log.i(tag, string);
    }
    public static void e(String tag, String string) {
        if (LOG) android.util.Log.e(tag, string);
    }
    public static void d(String tag, String string) {
        if (LOG) android.util.Log.d(tag, string);
    }
    public static void v(String tag, String string) {
        if (LOG) android.util.Log.v(tag, string);
    }
    public static void w(String tag, String string) {
        if (LOG) android.util.Log.w(tag, string);
    }
}

Единственное, что мне нужно было сделать во всех исходных файлах, это заменить импорт android.util.Log с моим собственным классом.

96
задан jjnguy 2 July 2009 в 18:30
поделиться

6 ответов

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

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

public void someMethode() throws SomeCheckedException {

    //  code

}

Затем позже вы сможете разобраться с исключения , если вы не хотите иметь дело с ними в этом методе.

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

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

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

}

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

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

try{    
}catch(MyOwnException me){
}catch(Exception e){
}
105
ответ дан 24 November 2019 в 05:34
поделиться

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

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

5
ответ дан 24 November 2019 в 05:34
поделиться

Хотя я согласен, что перехватывать необработанное исключение - плохой стиль, существуют способы обработки исключений, которые обеспечивают превосходное ведение журнала и возможность обрабатывать неожиданные ситуации. Поскольку вы находитесь в исключительном состоянии, вы, вероятно, больше заинтересованы в получении хорошей информации, чем во времени ответа, поэтому производительность 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;
    }
}
92
ответ дан 24 November 2019 в 05:34
поделиться

Перехватить базовое исключение «Исключение»

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }
14
ответ дан 24 November 2019 в 05:34
поделиться

Да, есть.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}
4
ответ дан 24 November 2019 в 05:34
поделиться

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

Если да:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}
3
ответ дан 24 November 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: