這是因爲在你示例命令不產生錯誤,使用的是redis.call
和redis.pcall
錯誤地一個棘手的情況下(因爲ARGV[2]
是nil
象錯誤消息告訴你)。所以在這兩種情況下,錯誤都不會被恢復。
這裏就是命令實際上失敗,你可以看到不同的例子:
redis 127.0.0.1:6379> set foo bar
OK
redis 127.0.0.1:6379> eval 'redis.call("hget","foo","bar")' 0
(error) ERR Error running script (call to f_9e6d82f0740926e0a70775430bda59a54d4e0664): ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379> eval 'redis.pcall("hget","foo","bar")' 0
(nil)
但是,您可能會注意到,我沒有回的pcall
的結果,所以該腳本返回nil
。如果我返回錯誤命令的結果怎麼辦?
redis 127.0.0.1:6379> eval 'return redis.call("hget","foo","bar")' 0
(error) ERR Error running script (call to f_d0a8dce7264708876edf262052788fc90a8e8325): ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379> eval 'return redis.pcall("hget","foo","bar")' 0
(error) ERR Operation against a key holding the wrong kind of value
隨着call
沒有什麼變化,因爲錯誤(認爲它像其他語言的異常 - 使用Java,Python等)的功能有機會反正返回前被拋出。
雖然pcall
,但函數調用返回一個表格,其中一個err
字段被Redis轉換爲「錯誤回覆」,因此您不會看到它。你如何檢查?線性化它!
redis 127.0.0.1:6379> eval 'local t = redis.pcall("hget","foo","bar"); local r = {type(t)}; for k,v in pairs(t) do r[#r+1] = k; r[#r+1] = v; end; return r' 0
1) "table"
2) "err"
3) "ERR Operation against a key holding the wrong kind of value"
很好的指導答案! –