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