Два способа вызвать исключение в C ++ (без использования кучи)

0

Я создал собственное MatrixArithmeticException, конструктор которого принимает int который указывает, какой тип ошибки был сделан. Я попытался в своем коде два способа выбросить исключение. Это два способа:

  1. Создайте экземпляр MatrixArithmeticException и выбросите экземпляр.
  2. throw MatrixArithmeticException(0);//or whatever the int is supposed to be

Код работает в любом случае, но мой вопрос в том, что он более эффективен (с точки зрения пространства)? Кроме того, почему второй способ, похоже, работает так же хорошо?

EDIT: из нескольких ответов, которые я получил по этому вопросу (и комментарий к одному из этих ответов), я должен был предоставить свой код для первого способа.

Я никогда не использовал динамическую память в любом случае (я пытался намекнуть на это с заголовком вопроса, но этого явно недостаточно). Что касается моего кода для первого метода, я сделал это:

MatrixArithmeticException dimensionsDoNotMatch(0);
throw dimensionsDoNotMatch;

Я предполагаю, что этот вопрос будет эквивалентным на основе стека C++ спросить кого-то о различии между этим:

MatrixAritmeticException dimensionsDoNotMatch = new MatrixArithmeticException(0);
throw dimensionsDoNotMatch;

и это:

throw new MatrixArithmeticException(0);

Кажется, что оба вопроса имеют общий ответ. std::cout << "Thanks, guys!!" << std::endl;

Теги:
exception
constructor

3 ответа

2
Лучший ответ

Первый способ заключается в явном создании локального объекта как lvalue (что-то, что вы можете взять по адресу), а затем его выброса.

Второй способ заключается в создании временного объекта (rvalue) и его бросках, однако бросание обычно включает в себя копирование - если оно не будет отменено или перемещено.

Второй способ потенциально более эффективен, поскольку он может преодолевать и/или перемещаться без вашего вмешательства или намеков.

Кроме того, небольшая "заметка", использующая int для обозначения того, какая ошибка была сделана, - это то, что вы, возможно, захотите воздержаться от выполнения, даже если я не вижу, что именно вы делаете; попробуйте перечислить вместо этого!

  • 0
    ОП даже не показывает, что он использует для объявления «1-й путь» .
  • 0
    @ g-makulik Похоже, я правильно понял, о чем он! :)
Показать ещё 2 комментария
0

Вы можете многое бросить в C++, хотя мы обычно бросаем ошибки.

Решив выбросить ошибку, вы можете напрямую передать объект ошибки или бросить указатель на него, поскольку в большинстве случаев код сразу вызывает объект ошибки.

Решив бросить его напрямую, вы можете построить его в инструкции throw или заранее. Я рекомендую построить его на месте, если его простая ошибка, как показано выше

Строки линии в основном эквивалентны, за исключением того, что в первом случае временное значение ошибки логически сбрасывается в локальную переменную перед броском, тогда как в дальнейшем она находится в неименованной временной переменной. В отличие от них они будут отличаться скоростью, но если они это сделают, то, скорее всего, будет быстрее.

0
  1. Не создавайте исключения в куче (используя new()).
  2. Не копируйте зараженные экземпляры исключений, повторите бросок.
  3. Поймайте их, используя ссылки const.

Это мои эмпирические правила для устранения C++ исключений.

почему второй способ, похоже, работает так же хорошо?

Ваше MatrixArithmeticException просто предоставляет конструктор, принимающий int argument. Нет никакой разницы с их распределением (из объявлений конструктора), и оба метода создадут исключение в стеке (помимо того, что вы имели в виду использование new MatrixArithmeticException() при new MatrixArithmeticException() "Создать экземпляр", см. Мою точку 1. тогда),

Ещё вопросы

Сообщество Overcoder
Наверх
Меню