Портативно обработайте исключительные ошибки в C++

Это сработало для меня

def command = '''
    ps aux | grep bash | awk '{print $1}'
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text

Если вы хотите запускать несколько команд, вы можете добавить их в команду.

def command = '''
    ls -ltr
    cat secret
'''
def proc = ['bash', '-c', command].execute()
proc.waitFor()
println proc.text
5
задан thelsdj 22 July 2009 в 20:01
поделиться

5 ответов

попробуйте {xxx}, выгода (...) {xxx} была бы более портативной, но не могла бы поймать столько же. Это зависит от параметров компилятора и сред.

Используя настройки VC ++ по умолчанию, асинхронные (SEH), ошибки не обеспечиваются инфраструктуре EH C++; для ловли их, необходимо использовать обработчики SEH (__ попытка / __ кроме) вместо этого. VC ++ позволяет Вам направлять ошибки SEH посредством обработки ошибок C++, которая позволяет выгоде (...) захватывать ошибки SEH; это включает ошибки памяти, такие как нулевой указатель, разыменовывает.Подробнее.

На Linux, однако, многие ошибки, для которых Windows использует SEH, обозначаются через сигналы. Они никогда не пойманы попыткой/выгодой; для обработки их, Вам нужен обработчик сигналов.

10
ответ дан 14 December 2019 в 01:22
поделиться

Почему бы не использовать исключения стандарта C++ вместо собственного расширения MSFT? C++ имеет понятие обработки исключений.

struct my_exception_type : public logic_error {
    my_exception_type(char const* msg) : logic_error(msg) { }
};

try {
    throw my_exception_type("An error occurred");
} catch (my_exception_type& ex) {
    cerr << ex.what << endl;
}

C++ также имеет “всеобъемлющий” пункт поэтому, если Вы хотите зарегистрировать исключения, можно использовать следующую обертку:

try {
    // …
}
catch (...) {
}

Однако это не очень эффективно в C++, потому что создание такой общей обертки означает, что обработка кода должна быть вставлена в каждый последующий стековый фрейм компилятором (в отличие от этого, в управляемых системах как.NET, куда обработка исключений происходит без доплаты, пока никакое исключение на самом деле не выдается).

0
ответ дан 14 December 2019 в 01:22
поделиться

Для мобильности одна вещь попробовать использует блоки try-catch для большинства ванильных исключений и затем установила оконечный обработчик (set_terminate_handler) для имения минимального рычага в наличии для катастрофических условий выхода. Можно также попытаться добавить что-то как atexit или on_exit обработчик. Ваша среда выполнения может быть причудливой или повредить при вводе этих функций, конечно, так остерегаться того, сколько Вы предполагаете нормальной средой.

Наконец, при использовании регулярных пар выгоды попытки можно рассмотреть использование функциональных блоков попытки в противоположность открытию блока попытки в теле функции:

int foo(int x) try {
  // body of foo
} catch (...) {
   // be careful what's done here!
}

они - относительно неизвестный блок C++ и могут в некоторых случаях предложить восстановление даже в случае частичного (мелкомасштабного) повреждения стека.

Наконец, да, Вы, вероятно, захотите заняться расследованиями, какие сигналы можно continuably обработать самостоятельно или на котором Вы могли бы прерваться, и если Вы хотите меньше механизмов обработки на месте, Вы могли бы считать вызов ни один брошенной версией нового оператора, и компилирующий для не генерации исключений в операции с плавающей запятой в случае необходимости (можно всегда проверять isnan(.), isfinite(.), на результатах FP для защиты себя).

На той последней ноте, быть осторожным: у меня есть уведомление, что функции классификации результатов с плавающей точкой могут быть в различных заголовках в соответствии с Linux и окнами..., таким образом, Вы можете иметь к conditionalize, который они включают.

Если Вы чувствуете себя шаловливыми, запишите все это с помощью setjmp и longjmp (это - шутка...).

0
ответ дан 14 December 2019 в 01:22
поделиться

Перехват исключений C ++ с помощью catch (...) уже помещает вас в сумеречную зону.

Попытка отловить ошибки не пойманный catch (...) помещает вас прямо в неопределенное поведение. Никакой код C ++ не будет работать гарантированно. Ваш минимальный код регистрации может вызвать запуск ракеты.

Я рекомендую даже не пытаться поймать (...) . Перехватывайте только исключения, которые вы можете осмысленно и безопасно регистрировать, и позволяйте ОС обрабатывать все остальное, если таковые имеются.

0
ответ дан 14 December 2019 в 01:22
поделиться

One way that is easy to use, portable, and barely use any resources would be to catch empty classes. I know this may sound odd at first, but it can be very useful.

Here is an example I made for another question that applies for your question too: link

Also, you can have more than 1 catch:

try
{
   /* code that may throw exceptions */
}
catch (Error1 e1)
{
   /* code if Error1 is thrown */
}
catch (Error2 e2)
{
   /* code if Error2 is thrown */
}
catch (...)
{
   /* any exception that was not expected will be caught here */
}
-1
ответ дан 14 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: