c ++ оператор try-кроме - PullRequest
       64

c ++ оператор try-кроме

4 голосов
/ 06 июля 2011

Я наткнулся на эту статью об обнаружении VMWare или Virtual PC
http://www.codeproject.com/KB/system/VmDetect.aspx
и я увидел, что они используют какое-то утверждение try-кроме.
Поэтому я посмотрел в MSDN: http://msdn.microsoft.com/en-us/library/s58ftw19%28v=vs.80%29.aspx

и я не понимаю, зачем мне использовать попытку, кроме старой доброй попытки. это просто дает мне дополнительную информацию об исключении?
Если это так, я могу использовать try-catch, когда использую код из прилагаемой статьи, верно?
спасибо:)

Ответы [ 5 ]

6 голосов
/ 06 июля 2011

__try / __except - это a try / catch, для исключения другого типа.Вы можете отлавливать аппаратные исключения, такие как нарушение с плавающей запятой, неправильная ссылка на указатель и т. Д., А не исключения C ++.Это называется структурированной обработкой исключений, или SEH, и у MSDN немало информации, если вы знаете, где искать.

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

2 голосов
/ 06 июля 2011

__try и __except являются частью структурированной обработки исключений , это модель обработки исключений, отличная от стандартной, так как она обрабатывает аппаратные исключения идентично программным, см. Ссылку дляинформация.

2 голосов
/ 06 июля 2011

MSDN обычно не совсем понятен во всем этом, но исключения, рассматриваемые __try / __except, не являются исключениями C ++, а system исключения. Такие вещи, как ошибка сегментации.

1 голос
/ 06 июля 2011

Предложения __try, __except и __finally предназначены для Структурная обработка исключений , это механизм обработки исключений для исключений, генерируемых Windows. Они не такие, как исключения C ++.

1 голос
/ 06 июля 2011

Microsoft создала Структурированную обработку исключений для Microsoft C ++ до того, как фактический стандарт C ++ также начал включать исключения. Поэтому в Windows все существующие исключения являются исключениями SEH, но не все из них являются исключениями C ++.

__ try / __except - это способ отловить исключения SEH (и случайно также исключения C ++). try / catch - это способ ловить только исключения C ++. Я также напоминаю, что существует ограничение на невозможность использования обеих функций в одной функции, но это легко обойти.

Для использования просто используйте try / catch для любых исключений. Если кто-то явно выдает вам исключение SEH (деление на ноль, разыменование нулевого указателя и т. Д.), Перехватите его и конвертируйте в обычный поток программы как можно быстрее, например, в обычное исключение или остановку программного обеспечения.

...