無法接觸到伺服器,但有些問題需要異常的資料,雖然可以在丟擲異常時把資料給手動列印到日記,感覺太麻煩了
記得有看豆瓣的架構時,有提到他們在發生異常時,會把當時的所有變數都列印到日記裡,方便除錯.
在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 異常處理...