Чем 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. Чем это отличается?
Это ответ на вопрос (вам не нужно делать это самостоятельно).