Как вы работаете с исключениями
От: iix  
Дата: 07.03.07 15:32
Оценка:
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 t)
  {
   // Выпускаем наружу истинное исключение
   t.s();
  }
};


Собственно вопрос вы преобразуете исключения или оставляете как есть?
Re: Как вы работаете с исключениями
От: Gajdalager Украина  
Дата: 07.03.07 15:38
Оценка:
Здравствуйте, iix, Вы писали:

iix>
....
iix>


iix>Собственно вопрос вы преобразуете исключения или оставляете как есть?


В жаве, если жду на checked-исключение, которое не исправляеться (к примеру, FileNotFound и никаких решений на этом уровне принять нельзя), обертываю в RuntimeException(которое uncheked). В других случаях пускаю наверх неизменным. Конечно, если можно исправить, то ловлю
Re: Как вы работаете с исключениями
От: nikov США http://www.linkedin.com/in/nikov
Дата: 07.03.07 15:47
Оценка: 4 (3) +4
Здравствуйте, iix, Вы писали:

iix>Собственно вопрос вы преобразуете исключения или оставляете как есть?


Если в месте перехвата исключения я понимаю причину его возникновения, то имеет смысл бросить наружу более информативное исключение уровня бизнес-логики, сохранив в нем информацию о первоначальном исключении (например, в .NET с помощью InnerException).

Если не понимаю — выпускаю то исключение, которое было первоначально.

Я думаю, оборачивать все исключение в свое — плохая практика, их становится труднее фильтровать снаружи.
Re[2]: Как вы работаете с исключениями
От: iix  
Дата: 07.03.07 16:57
Оценка:
Здравствуйте, 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)?
Re[3]: Как вы работаете с исключениями
От: GlebZ Россия  
Дата: 07.03.07 17:39
Оценка:
Здравствуйте, iix, Вы писали:


iix>Если все исключения унаследованны от разных классов то как же отлавливать все это добро сгенерированное d.t(a). Не легче ли все исключени поймать

iix>и преобразовать в свое (error_d_t_s)?
Практически во всех более менее современных языках — исключения наследуются от одного класса. В случае C++ все несколько сложнее. Лучше всегда подходить к вопросу конкретно в каждом случае, и думать — зачем ты перехватываешь, и что ты хочешь получить на том или ином этапе. Иногда в C++ я специально выпускал исключения наверх, чтобы можно было ватсоном снять стек.
Re[3]: Как вы работаете с исключениями
От: ambel-vlad Беларусь  
Дата: 07.03.07 19:37
Оценка:
Hi iix

i>Если все исключения унаследованны от разных классов то как же отлавливать все это добро сгенерированное d.t(a). Не легче ли все исключени поймать и преобразовать в свое (error_d_t_s)?


А толку? Ну поймаю я свое error_d_t_s в другом месте. И что оно мне даст? Никакой информации, которая может помочь в поиске проблемы, оно не имеет. Я получу только то, что где-то возникло какое-то (причем, мне не известное) исключение.

Согласен с товарищем nikov (http://rsdn.ru/forum/?mid=2397768
Автор: nikov
Дата: 07.03.07
). Можешь что-то осмысленное сделать — делай. А не можешь, то не трогай.

--
С Уважением
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.