Подтвердить что ты не робот

Что лучше использовать, блок __try/__ except или блок try/catch?

Мне интересно, какой из лучших способов поймать исключения, которые я бросаю: это блок __try/__except или блок try/catch?

Я пишу на С++, и программа будет использоваться только в Windows, поэтому переносимость не является проблемой.

Спасибо!

4b9b3361

Ответ 1

Вы должны использовать блок try/catch.

Как уже ответили другие, __try/__except предназначен для обнаружения SEH (вызванных Windows ошибок), а не для обхода общих исключений.

Самое главное, __try и __catch могут не запускать деструкторы С++ или правильно раскручивать стек при возникновении исключения.

За исключением редких случаев, вы никогда не должны пытаться поймать исключения SEH.

EDIT: Хорошо, я был уверен в этом (это то, что мне всегда говорили), но @Hans говорит, что, видимо, есть компилятор, который вы можете использовать, чтобы изменить это. Я думаю, что документы на /EHa вводят в заблуждение или, по крайней мере, неполные, о том, что здесь происходит. Если кто-то найдет окончательные документы, которые докажут это неправильно, я с радостью удалю этот ответ.

Даже если это окажется ложным, вы все равно должны использовать try и catch просто потому, что они стандартные, а __try и __except - нет.

Ответ 2

Это две разные вещи. try/catch - знакомые ключевые слова С++, которые вы знаете. __try/__except используется для исключения исключений SEH. Исключения, вызванные самой Windows, такие как DivisionByZero или AccessViolation. Он хорошо описан в

Ответ 3

__try/__except предназначен для вызова кода Win32 C, который не поддерживает исключения, но использует механизм структурированного кода ошибки/обработки. __try/__except преобразует ошибки C в блок исключений, аналогичный С++ try/catch.

Для получения дополнительной информации см. эту статью MSDN.

Ответ 4

Стандартные С++ используют блоки try/catch, поэтому я бы рекомендовал их использовать, если вам нужен "стандартный" механизм исключения, основанный на стандартной библиотеке С++.

Однако, если вы планируете использовать структурированную обработку исключений, предоставляемую через Windows SDK (см. здесь), затем используйте __try/__except.

Ответ 5

Как только вы что-то бросили, у вас больше нет выбора, как его поймать. Если вы выбросите исключения С++ (т.е. С помощью throw), используйте try/catch. Если вы выбрали исключения Windows (т.е. С помощью RaiseException), используйте __try/__except. Попытка смешать их просто добавит лишних хлопот в вашу жизнь.