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

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

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

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

2

Решение

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

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

4

Другие решения

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

setjmp/longjmp не буду.

4

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

2

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

0

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

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

-2
По вопросам рекламы [email protected]