iix>Собственно вопрос вы преобразуете исключения или оставляете как есть?
В жаве, если жду на checked-исключение, которое не исправляеться (к примеру, FileNotFound и никаких решений на этом уровне принять нельзя), обертываю в RuntimeException(которое uncheked). В других случаях пускаю наверх неизменным. Конечно, если можно исправить, то ловлю
Здравствуйте, iix, Вы писали:
iix>Собственно вопрос вы преобразуете исключения или оставляете как есть?
Если в месте перехвата исключения я понимаю причину его возникновения, то имеет смысл бросить наружу более информативное исключение уровня бизнес-логики, сохранив в нем информацию о первоначальном исключении (например, в .NET с помощью InnerException).
Если не понимаю — выпускаю то исключение, которое было первоначально.
Я думаю, оборачивать все исключение в свое — плохая практика, их становится труднее фильтровать снаружи.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, iix, Вы писали:
iix>>Собственно вопрос вы преобразуете исключения или оставляете как есть?
N>Если в месте перехвата исключения я понимаю причину его возникновения, то имеет смысл бросить наружу более информативное исключение уровня бизнес-логики, сохранив в нем информацию о первоначальном исключении (например, в .NET с помощью InnerException).
N>Если не понимаю — выпускаю то исключение, которое было первоначально.
N>Я думаю, оборачивать все исключение в свое — плохая практика, их становится труднее фильтровать снаружи.
class A {
public:
s()
{
throw error_s();
}
};
class B {
public:
t(A t)
{
try{
t.s();
}
catch(...){
// Преобразуем все исключения в свое исключениеthrow error_t();
}
}
};
class D {
public:
t(A l)
{
// Выпускаем наружу истинное исключение
l.s();
s(); // Может сгенерировать erro_s, bad_param, bad_alloc
d(); // Может сгенерировать error_d, error_param
f(); // Может сгенерировать error_f, run_error, any_error, bad_alloc
g(); // Может сгенерировать error_g, thread_error, io_error, bad_thread_id
h(); // Может сгенерировать и какието еше исключения...
}
};
void main()
{
A a;
D d;
//-------------------------------------------
d.t(a); // Зде на выходе получаем уйму разных исключений
//-------------------------------------------
da(); // Может сгенерировать исключение bad_param
da1(); // Может сгенерировать исключение thread_error
}
Если все исключения унаследованны от разных классов то как же отлавливать все это добро сгенерированное d.t(a). Не легче ли все исключени поймать
и преобразовать в свое (error_d_t_s)?
iix>Если все исключения унаследованны от разных классов то как же отлавливать все это добро сгенерированное d.t(a). Не легче ли все исключени поймать iix>и преобразовать в свое (error_d_t_s)?
Практически во всех более менее современных языках — исключения наследуются от одного класса. В случае C++ все несколько сложнее. Лучше всегда подходить к вопросу конкретно в каждом случае, и думать — зачем ты перехватываешь, и что ты хочешь получить на том или ином этапе. Иногда в C++ я специально выпускал исключения наверх, чтобы можно было ватсоном снять стек.
Hi iix
i>Если все исключения унаследованны от разных классов то как же отлавливать все это добро сгенерированное d.t(a). Не легче ли все исключени поймать и преобразовать в свое (error_d_t_s)?
А толку? Ну поймаю я свое error_d_t_s в другом месте. И что оно мне даст? Никакой информации, которая может помочь в поиске проблемы, оно не имеет. Я получу только то, что где-то возникло какое-то (причем, мне не известное) исключение.