Мне интересно, какой из лучших способов поймать исключения, которые я бросаю: это блок __try/__except или блок try/catch?
Я пишу на С++, и программа будет использоваться только в Windows, поэтому переносимость не является проблемой.
Спасибо!
Мне интересно, какой из лучших способов поймать исключения, которые я бросаю: это блок __try/__except или блок try/catch?
Я пишу на С++, и программа будет использоваться только в Windows, поэтому переносимость не является проблемой.
Спасибо!
Вы должны использовать блок try
/catch
.
Как уже ответили другие, __try
/__except
предназначен для обнаружения SEH (вызванных Windows ошибок), а не для обхода общих исключений.
Самое главное, __try
и __catch
могут не запускать деструкторы С++ или правильно раскручивать стек при возникновении исключения.
За исключением редких случаев, вы никогда не должны пытаться поймать исключения SEH.
EDIT: Хорошо, я был уверен в этом (это то, что мне всегда говорили), но @Hans говорит, что, видимо, есть компилятор, который вы можете использовать, чтобы изменить это. Я думаю, что документы на /EHa
вводят в заблуждение или, по крайней мере, неполные, о том, что здесь происходит. Если кто-то найдет окончательные документы, которые докажут это неправильно, я с радостью удалю этот ответ.
Даже если это окажется ложным, вы все равно должны использовать try
и catch
просто потому, что они стандартные, а __try
и __except
- нет.
Это две разные вещи. try/catch - знакомые ключевые слова С++, которые вы знаете. __try/__except
используется для исключения исключений SEH. Исключения, вызванные самой Windows, такие как DivisionByZero или AccessViolation. Он хорошо описан в
__try/__except
предназначен для вызова кода Win32 C, который не поддерживает исключения, но использует механизм структурированного кода ошибки/обработки. __try/__except
преобразует ошибки C в блок исключений, аналогичный С++ try/catch.
Для получения дополнительной информации см. эту статью MSDN.
Стандартные С++ используют блоки try/catch, поэтому я бы рекомендовал их использовать, если вам нужен "стандартный" механизм исключения, основанный на стандартной библиотеке С++.
Однако, если вы планируете использовать структурированную обработку исключений, предоставляемую через Windows SDK (см. здесь), затем используйте __try
/__except
.
Как только вы что-то бросили, у вас больше нет выбора, как его поймать. Если вы выбросите исключения С++ (т.е. С помощью throw
), используйте try
/catch
. Если вы выбрали исключения Windows (т.е. С помощью RaiseException
), используйте __try
/__except
. Попытка смешать их просто добавит лишних хлопот в вашу жизнь.