Ловить или не ловить - PullRequest
       12

Ловить или не ловить

3 голосов
/ 16 марта 2010

Должно ли приложение ловить "плохие" сигналы, такие как SIGSEV, SIGBUS?

Ответы [ 4 ]

7 голосов
/ 16 марта 2010

Эти сигналы генерируются в ситуациях, которые «никогда не должны происходить», когда ваша программа находится в неопределенном состоянии.Если вы их поймаете, продолжение выполнения будет крайне проблематичным, поскольку почти наверняка приведет к более, возможно, даже более серьезным, ошибкам.Кроме того, если вы не поймаете их, ОС может выполнять такие действия, как создание полезной диагностики, такой как дампы ядра.Так что я бы сказал «нет», если вы не хотите, чтобы дамп ядра и ваша обработка ошибок выполняла что-то очень простое, например, запись в журнал и завершение работы.

4 голосов
/ 16 марта 2010

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

1 голос
/ 16 марта 2010

Нет, ты не должен. Я знаю, что это заманчиво. Но есть только очень очень мало причин, по которым вы бы хотели поймать фатальные сигналы, такие как SIGSEV и SIGBUS.

Одним из немногих исключений может быть наличие некоторого дополнительного сигнального / посмертного кода, который сообщает о сбое вашей программы. Даже это следует делать только в контролируемых средах, а не в коде, который отправляется сотням тысяч пользователей.

Вы должны быть готовы к тому, что сам ваш посмертный код будет аварийно завершен, потому что SIGSEV и SIGBUS являются признаками дефектного кода или данных.

0 голосов
/ 18 марта 2010

Может быть ситуация, когда вы должны перехватывать сигналы, такие как SIGSEGV и SIGBUS: один из таких примеров: ваш указатель указывает на область памяти mmaped, и вы делаете * ptr = x, например, этот адрес памяти принадлежит сетевому файлуи ваша сеть выдает некоторые ошибки.на данный момент единственный способ проверить ошибки - это поймать сигнал и повторить попытку или сделать что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...