RUBY中儲存異常現場

2021-08-31 20:13:16 字數 1775 閱讀 6676

無法接觸到伺服器,但有些問題需要異常的資料,雖然可以在丟擲異常時把資料給手動列印到日記,感覺太麻煩了

記得有看豆瓣的架構時,有提到他們在發生異常時,會把當時的所有變數都列印到日記裡,方便除錯.

在ruby中實現這個也不難,稍微有點難的是本地變數的儲存

例項變數已經在rails已經有現在的實現了

[quote]

# file activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 12

def instance_values #:nodoc:

hash[instance_variables.map ]

end

但沒有找到local_values這個方法,好吧,我們自己來實現乙個

def local_values(context, black_list = )

black_list.concat(%w[local_value_hashs])

context.eval <<-eos

local_value_hashs = {}

local_variables.each do |var_name|

next if [#'"}.join ','}].include? var_name

local_value_hashs[var_name] = eval(var_name)

endlocal_value_hashs

eosend

這個方法預設只需要乙個引數,context引數在發生異常的rescue語句裡呼叫binding方法,black_list引數是乙個陣列,當你不需要把某些本地變數給列印出來的,把它的名字寫到這個陣列就行了

小demo

require 'pp'

class kitty

def hello

str = "hello kitty"

raise 'test kitty'

rescue

pp local_values(binding)

enddef local_values(context, black_list = )

black_list.concat(%w[local_value_hashs])

context.eval <<-eos

local_value_hashs = {}

local_variables.each do |var_name|

next if [#'"}.join ','}].include? var_name

local_value_hashs[var_name] = eval(var_name)

endlocal_value_hashs

eosend

endkitty.new.hello

輸出結果

[quote][/quote]

思路[list]

[*]通過binding方法獲取異常發生的上下文

[*]呼叫上下文的eval方法,在eval裡通過ruby自帶的local_variables,獲取所有本地變數的名稱

[*]通過eval獲取本地變數的值,把它存起來,返回結果

[/list]

在rails中,再配合exception_notification,用著就覺得很舒服了,追求完美話,可以把常量,自定的全域性變數都列印出來

C 11 併發程式設計 16 在期望中儲存異常

如果在非同步執行緒中發生了異常,等待期望的執行緒如何才能知道並且正確的處理異常呢?假設有如下所示的乙個求平方根的函式 double square root double x return sqrt x 通常,如果在當前執行緒上下文中呼叫square root 方法如下 double y square...

儲存函式,儲存異常處理

異常 sqlstate error 1022 內建異常描述 declare exit handler for sqlstate 資訊 執行的動作 declare continue handler for sqlstate 資訊 執行的動作 注意 1 執行順序 宣告位置無要求,建議在開頭,當錯誤出現的...

Oracle中儲存過程

1 建立乙個儲存過程 create or replace procedure pro name parameter1 parameter2 is as begin plsql sentences pl sql語句,儲存過程功能實現的主體 exception dowith sentences 異常處理...