2017-02-03 4 views
2

Как мы можем поймать и/или обработать все необработанные исключения в рубине?Как поймать все исключения в рубине?

Мотивация для этого, возможно, заключается в регистрации каких-либо исключений для разных файлов или отправки и электронной почты для системного администрирования, например.

В Java мы будем делать

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex); 

В NodeJS

process.on('uncaughtException', function(error) { 
    /*code*/ 
}); 

В PHP

register_shutdown_function('errorHandler'); 

function errorHandler() { 
    $error = error_get_last(); 
    /*code*/  
} 

Как мы можем сделать это с рубином?

ответ

3

В Ruby вы просто оберните свою программу вокруг блока begin/rescue/end. Любое необработанное исключение будет пузыриться до этого блока и обрабатываться там.

+0

Выполняется ли это, даже если у нас есть исключение из другого файла или библиотеки сторонних разработчиков? – GarouDan

+1

Да, он работает даже тогда. – eiko

+0

Это неясно. –

4

Расширенный решение использование exception_handler gem

Если вы хотите просто перехватывать все исключения, и положить, например, в журналах, вы можете добавить следующий код в ApplicationController:

begin 
    # do something dodgy 
rescue ActiveRecord::RecordNotFound 
    # handle not found error 
rescue ActiveRecord::ActiveRecordError 
    # handle other ActiveRecord errors 
rescue # StandardError 
    # handle most other errors 
rescue Exception 
    # handle everything else 
end 

Более подробную информацию вы можете найти в этом thread.

+0

'rescue Exception' действительно [тяжело передано] (http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby). Вы могли бы упомянуть, почему это вообще плохая идея. –

+0

Спасибо за комментарий, я еще не знал об этом. – w1t3k

+0

Нет проблем. 'rescue Exception' похоже на включение кнопки повтора при пожарной тревоге. Вы можете это сделать, но вы, вероятно, не должны;) –