***第二次编辑,表明我需要处理多个地点。
EDITED表示即使内置处理程序也会引发异常。
我目前正在解析来自API的回复,其中包含我使用
转换为哈希的数组hash_table = xml_response.to_h
挑战在于,我所寻找的数据有时位于不同的位置,当我使用关键方法时:
data_i_need = hash_table['key1']['key2'][0]
如果那里什么都没有,就会抛出这个错误:
undefined method `[]' for nil:NilClass (NoMethodError)
我尝试过使用:
if hash_table['key1']['key2'][0].present?
data_i_need = hash_table['key1']['key2'][0]
puts "data was here"
elsif hash_table['key3']['key4'][0].present?
data_i_need = hash_table['key3']['key4'][0]
puts "data here"
elsif hash_table['key5']['key6'][0].present?
data_i_need = hash_table['key5']['key6'][0]
puts "data here"
else
"data not found"
end
但它会引发同样的错误:
undefined method `[]' for nil:NilClass (NoMethodError)
答案 0 :(得分:0)
你应该检查是否存在所有先前的散列键,因为如果其中一个是nil,则会引发异常
hash_table['key1'].present? && hash_table['key1']['key2'].present? && hash_table['key1']['key2']['key3'].present? && hash_table['key1']['key2']['key3'][0].present?
更新: 要返回“未找到”,您可以捕获这样的异常:
data_i_need = begin
hash_table['key1']['key2']['key3'][0]
rescue NoMethodError
"data not found"
end
更新2: 您可以使用此函数来检查密钥是否存在于if else条件语句中的哈希值中:
h = {:a => {:b => {0 => 1}}, :c => 2}
def has_nested_keys?(hash, *keys)
keys.inject(hash) do |result, key|
result = result[key]
end
true
rescue
false
end
has_nested_keys?(h, :a, :b, 0) #=> true
has_nested_keys?(h, :c, :d, 0) #=> false