Почему троичная операция не увенчалась успехом улова - PullRequest
0 голосов
/ 08 июня 2018

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

#include <iostream>
#include <exception>
using namespace std;

int main()
{
int test = 0;
cout << "test set to 0" << endl;
try {
    cout << (test ? "A String" : 0) << endl;
} catch(...) {
    cout << "Exception" << endl;
}
cout << "Test done" << endl;

return 0;
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

C ++, в отличие от большинства других языков, имеет понятие неопределенное поведение .Это означает, что недопустимые действия не приводят к исключению, а к сбою, повреждению данных или чему-то еще. исключение в C ++ - это то, что код явно throw s и catch es.Это не так в вашем коде.

Результат (test ? "A String" : 0) равен const char *.Таким образом, 0 преобразуется в const char *, то есть указатель NULL.Стандартная библиотека имеет перегрузку для operator <<, которая ожидает, что const char * будет ненулевой C-строкой.

То есть operator << просто не проверяет входной параметрдля NULL.И отсылка к нулевому указателю - неопределенное поведение.В большинстве систем это приведет к ошибке сегментации на уровне ОС и завершению программы.

Для полноты, в MSVC вы можете скомпилировать с /EHa, чтобы рассматривать исключения SEH как исключения C ++, тогда catch(...) такжепоймать тех.Но не используйте эту функцию, так как она может привести к утечке ресурсов и непереносимому, не поддерживаемому коду.

0 голосов
/ 08 июня 2018

Ваш код не выдает никаких исключений, тип "A String" равен const char*, поэтому указатель и 0 могут быть оценены как NULL, а также указатель, что означает, что test ? "A String" : 0 возвращаетconst char*, ошибок нет.

Также я не думаю, что вы знаете, как работают исключения, если в вашем коде была ошибка типа test ? std::string{"A String"} : nullptr, эта ошибка будет ошибкой во время компиляции, а не исключением,поскольку компилятор не сможет найти общий тип для обоих типов.

...