Чем C++ try/catch отличается от C setjmp/longjmp?

Я знал об обработке исключений в C++ с использованием try а также catch блоки. Я задавался вопросом, была ли эта функциональность там в C, Итак, теперь я знаю, что основная обработка ошибок в C сделано setjmp/longjmp,

поскольку setjmp/longjmp нет в C++ Можно ли предположить, что try/catch лучше? В каких случаях???

Я мог бы реализовать try/catch функциональность в C с помощью setjmp/longjmp, Чем это отличается?

5 ответов

Я думаю, что основное отличие состоит в том, что try / catch знает об объектах в стеке и знает, как вызывать dtors для объектов, размещенных в стеке, и setjmp ничего с этим не делает.

Кроме того, пользовательский интерфейс намного богаче, вы можете определить несколько типов исключений и вести себя по-разному в зависимости от этого

try/catch будет отвечать за RAII. Все объекты, которые покидают область видимости, будут должным образом уничтожены.

setjmp/longjmp не буду.

Несмотря на отсутствующие языковые функции, такие как RAII и т. Д., setjmp/longjmp принципиально отличается от механизма, используемого для бросания / отлова исключений. В наши дни исключения обрабатываются с использованием подхода с нулевой стоимостью, когда накладные расходы встречаются тогда и только тогда, когда исключение фактически выдается, а в противном случае нет накладных расходов. Поскольку предполагается, что в хорошем приложении исключения обычно не генерируются, это называется "нулевой стоимостью". С помощью setjmp/longjmp вы будете устанавливать точку перехода / контекст каждый раз, когда вы "входите в блок попытки". Следовательно, во время выполнения будет много накладных расходов только для установки точек перехода. В прошлом исключения были реализованы с использованием setjmp/longjmp (составителями, с RAII и всеми другими вещами, которые другие люди назвали "отсутствующими" - так что вы можете понять, почему их ответы не совсем верны), так что в теории вы можете добиться того же, но это будет намного хуже с точки зрения спектакль. Для получения более подробной информации о реализации обработки исключений, пожалуйста, обратитесь к Itanium C++ ABI: Обработка исключений.

В то время как setjmp/longjmp может или не может работать с деструкторами, это не главное отличие с точки зрения дизайна. Важно то, что когда вы бросаете исключение, вы не знаете или не заботитесь о том, где оно будет обработано. Реализация обходит стек вызовов до тех пор, пока не найдет предложение catch, которое может обработать брошенный тип, или пока оно не достигнет вершины стека; в последнем случае программа прерывается.

Я мог бы реализовать функциональность try/catch/finally в C, используя setjmp/longjmp. Чем это отличается?

Это ответ на вопрос (вам не нужно делать это самостоятельно).

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