Код для преднамеренного сбоя

Возможный дубликат:
Какой самый простой способ вызвать сбой программы на C ++?

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

if(<something is wrong>)
{
int *ptr = NULL;
*ptr = 0;
}

Это, конечно, вызывает исключение нулевой ссылки и приводит к аварийному завершению программы. Мне просто интересно, действительно ли это лучший способ сделать это? Прежде всего, это не очень хорошо читается. Без комментариев вы не могли бы понять, что сбой, который происходит здесь, предназначен. Во-вторых, от этого практически невозможно оправиться. Это не вызывает исключение, поэтому он не может быть обработан другим кодом. Это просто убивает программу без возможности возврата. Это также не дает большой подсказки относительно Зачем это должно было разбиться здесь. И он потерпит крах во всех сборках, в отличие, скажем, от утверждения. (У нас есть достаточно надежная система утверждений, но она не всегда используется в подобных случаях.)

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

6

Решение

Вы должны выбросить исключение, которое в основном вызывает преднамеренное и контролируемое падение. Вот пример с помощью этот вопрос.

throw string("something_went_wrong");

Еще лучше то, что ошибка поймана или исправлена. Assert также будет хорошим выбором.

2

Другие решения

Вы не можете «сбить» программу преднамеренно, потому что по самому определению сбой — это когда программа неправильно и не ведет себя детерминистически.

Стандартный способ прекратить выполнение — через std::terminate; обычный способ добиться этого — позвонить std::abort, который поднимает неблокируемый сигнал против процесса (приводя к std::terminate автоматически), а также заставляет многие операционные системы создавать дамп ядра.

4

Я думаю, что это способ вызвать дамп ядра в ситуациях, когда вы не отлаживаете. Затем дамп ядра дает вам достаточно информации для анализа проблемы. В случае «ошибок программиста» (или ошибок) это лучше, чем выбрасывать исключение, потому что разматывание стека не позволит вам создать разумный дамп ядра. Подобного эффекта можно добиться более элегантным способом, вызвав std :: terminate, предварительно зарегистрировав (с помощью std :: set_terminate) функцию, которая генерирует дамп ядра или что-то подобное. Увидеть Эта статья для более подробного объяснения.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector