Здравствуйте, 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)?