Как я могу обработать нарушение доступа в Visual Studio C++?

Обычно нарушение прав доступа завершает программу, и я не могу поймать исключение Win32, используя try а также catch, Могу ли я сохранить работоспособность моей программы даже в случае нарушения прав доступа? Желательно обработать исключение и показать пользователю, что произошло нарушение прав доступа.

РЕДАКТИРОВАТЬ: я хочу, чтобы моя программа была действительно надежной, даже несмотря на ошибки программирования. Чего я действительно хочу избежать, так это завершения программы даже за счет некоторого поврежденного состояния.

2 ответа

Решение

В Windows это называется структурированной обработкой исключений (SEH). Подробности смотрите здесь:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx

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

Используя SEH, вы можете обнаружить множество исключений, включая нарушения доступа, но не все (например, ошибка двойного стека). Даже при обнаружении исключений невозможно обеспечить 100% стабильность после исключения. Тем не менее, этого может быть достаточно, чтобы проинформировать пользователя, зарегистрировать ошибку, отправить сообщение обратно на сервер и выполнить корректный выход.

Я начну с того, что ваш вопрос содержит противоречие:

РЕДАКТИРОВАТЬ: я хочу, чтобы моя программа была действительно надежной,... То, что я действительно хочу избежать, это прекращение программы даже за счет некоторого поврежденного состояния.

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


Во-вторых, своего рода мнение. Что касается:

РЕДАКТИРОВАТЬ: я хочу, чтобы моя программа была действительно надежной, даже несмотря на ошибки программирования....

Когда под ошибками программирования вы подразумеваете все ошибки, тогда это невозможно.

Если под ошибками программирования вы имеете в виду: "программист неправильно использовал какой-то API, и я хочу вместо сообщения об ошибке писать сообщения об ошибках, то напишите весь код со встроенными двойными проверками: например, всегда проверяйте все указатели на NULL перед использованием, даже если" они не могут быть NULL, если программист не ошибся "и т. Д. (О, вы также можете не использовать C++;-)

Но ИМХО, какое-то количество ошибок программы, неважно, какие ошибки должно быть принято в любом приложении C++. (Если это не тривиально или вы не проверяете ад для военного или медицинского использования (даже тогда...).)


Другие уже упоминали SEH - это "простой" вопрос __try / __catch,

Возможно, вместо того, чтобы пытаться выявлять ошибки внутри программы, вы можете попытаться подружиться с Windows Error Reporting (WER) - я никогда этого не делал, но, насколько я понимаю, вы можете полностью настроить его через OutOfProcessException... функции обратного вызова.

Другие вопросы по тегам