2010-10-16 8 views
3
catch (Exception ex) 
{ 
    DBGlobals.Error("OHMjson.Graph.saveLastGraphName - Error: " + ex.getMessage()); 
    msg = "Unable to save data"; 
    status = false; 
} 

Этот фрагмент кода выдаст статус ложным, если я столкнулся с ошибкой.Обработка исключений

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

ответ

2

Во-первых, не поймайте Exception. Поймать определенный подкласс.

Во-вторых, да, может быть, что базовый IOException, который выглядит так, должен быть обернут в конкретном приложении. Вы могли бы, например:

final class DBGlobalsException extends Exception 
{ 
    Field somethingDBGlobalsSpecific; 

    //where this is shorthand for chained constructors that look like Exception 
    DBGlobalsException(String message, Throwable cause) 
    { 
    super(message,cause); 
    } 

    // elaborate your exception with whatever error state you want to propagate outwards 
    void setField(Field ...) {} 
} 

А вы могли бы тогда

catch (IOException ex) { 
    DBGlobals.Error("OHMjson.Graph.saveLastGraphName - Error: " + ex.getMessage()); 
    msg = "Unable to save data"; 
    status = false; 
    DBGlobalsException dbe = new DBGlobalsException(msg,ex); 
    dbe.setField(status /* or whatever */); 
    throw dbe; 
} 

Смотрите также: Throwing Exception, Throwing new and old exceptions, Rolling your own. Это всего лишь несколько, есть куча замечательных SO Q + A по обработке исключений, цепочке и т. Д. Некоторые полезные примеры передового опыта, изложенные в WikiBooks.

Также прочитайте Oded's answer и подумайте об этом ... ваше исключение должно инкапсулировать любой статус (коды ошибок, флаги и т. Д.), Необходимые для восстановления внешнего кода из условия - или он должен быть невосстановимым состояние (см. RuntimeException).

Наконец, каноническая эффективная ссылка на Java: Item 43: Throw Exceptions Appropriate to the Abstraction.

+0

Я не получил ваш первый момент, что это означает улов в конкретном подклассе. – John

+0

Почему нам нужно объявить класс окончательным – John

+0

@John: Поймать подкласс «Исключение» - это лучшая практика - не перехватывайте слишком широкий класс исключений. Вот хорошее описание (хотя в C#) http://stackoverflow.com/questions/426346/is-this-a-bad-practice-to-catch-a-non-specific-exception-such-as-system-exception – andersoj

4

Предпочтение бросать исключения для возврата кодов ошибок/статуса.

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

Смежные вопросы