пятница, 26 августа 2011 г.

Исключения в С++ : по ссылке, копией или по указателю?

Исключение в С++ можно бросить 2-мя способами:
  1. throw MyException();
  2. throw new MyException();
А поймать потом 3-мя:
  1. catch( MyException  ) {}
  2. catch( const MyException& ) {}
  3. catch( MyException* ){}
Ну конечно объект может быть константным а ссылка неконстантной. Ну ладно. Суть в том что 3-ий catch ловит 2-ой throw, а 1-ый и 2-ой ловят 1-ый throw. Из двух последних предпочтительней 2-ой вариант потому что он не делает копии. Ловить надо тоже самое что и бросал иначе не поймаешь. Вариант с броском указателя вызывает проблемы с освобождением памяти которое нужно или не нужно делать в блоке catch в зависимости от того указывает ли указатель на объект размещенный в куче с помощью вызова new или нет. Поэтому самый лучший вариант - ловить по ссылке.


Комментариев нет:

Отправить комментарий