Оператор try-catch в C
Есть ли оператор try-catch в C? или внешнюю библиотеку кто-то сделал? было бы очень полезно
если нет, то есть ли способ определить, является ли переменная массивом?
6 ответов
есть ли оператор try-catch в C? или внешнюю библиотеку кто-то сделал? было бы очень полезно
В Windows есть SEH, но вы не должны использовать это для общего использования приложения. Без чего-то вроде деструкторов C++ невозможно написать действительно безопасный код исключений.
если нет, то есть ли способ определить, является ли переменная массивом?
Да. Вы сами это отслеживаете.
В Си нет оператора try-catch, но вы можете создать механизм исключений, используя буферы перехода. Тем не менее, это, вероятно, очень плохая идея, поскольку теперь есть способ автоматически освобождать ресурсы при возникновении исключения.
Если вы имеете в виду void *
как переменная, тогда нет способа определить, является ли это массивом. Тем не менее, вы можете встроить логику в свое приложение для получения информации о типе времени выполнения (RTTI).
Я занимаюсь разработкой exceptions4c, системы обработки исключений в C (переносимая ANSI C), которая в настоящее время поддерживает: throw
, try
, catch
, finally
и еще несколько вкусностей. Например, он поддерживает шаблон Dispose, поэтому вы можете автоматически освобождать ресурсы. Вы также можете обрабатывать сигналы (такие как SIGFPE
а также SIGSEGV
) как будто они были исключениями.
Если компилятор может определить, является ли переменная массивом, вы тоже можете. Просто посмотрите, где он объявлен (или malloc'd, в случае динамически размещаемого массива).
Конечно, в Си нет встроенной поддержки исключений.
Взгляните на следующую ссылку, в основном, она использует setjmp() и longjmp ():
try-catch - это схема обработки ошибок в объектно-ориентированной среде, такой как C++. ANSI C не является объектно-ориентированным и требует от вас объявления типов переменных. В C обработка ошибок выполняется главным образом путем проверки возвращаемых значений вызываемых функций. Вы можете увидеть больше в грязной ветке здесь: ANSI C эквивалент try/catch?