2016-07-21 79 views
-1

我正在構建一個Sinatra API調用,它將觸發子進程中的長時間運行操作。我使用的是exception_handler寶石,但不明白我如何在分叉過程中使用它。處理分叉進程中的異常

西納特拉應用:

require 'sinatra' 
require 'rubygems' 
require 'bundler/setup' 
require 'exception_notification' 

use ExceptionNotification::Rack, 
    :email => { 
    :email_prefix => "[Example] ", 
    :sender_address => %{"notifier" <[email protected]>}, 
    :exception_recipients => %w{[email protected]}, 
    :delivery_method => :sendmail 
    } 

get '/error' do 
    raise 'Bad!' # Notification gets sent 
end 

get '/error_async' do 
    p1 = fork do 
    sleep 10 
    raise 'Bad! (async)' # Notification never gets sent 
    end 
    Process.detach(p1) 
end 

回答

1

得到它的工作,每docs

get '/error_async' do 

    p1 = fork do 

    begin 
     sleep 10 
     raise 'Bad! (async)' 
    rescue Exception => e 
     ExceptionNotifier.notify_exception(e) 
    end 

    end 
    Process.detach(p1) 

end 
+0

哇,如果你需要明確寫入'ExceptionNotifier.notify_exception'發送通知,然後是創業板基本是沒用的。像這樣的寶石的真正好處是,即使你不知道你的產品Sinatra/Rails應用程序在哪裏拋出異常,你會得到通知,因爲你沒有預料到它(如果你確實這樣做了,開始/ rescue')。 –

+0

@Mike你只是將正在被淘汰的代碼包裝到後臺進程中 - 我認爲這實際上是有道理的。 – Yarin

+0

確實,您可以爲新線程中的所有代碼做一個搜索,看起來有點便宜,但它可以完成工作。 –