典型的情況是應用的**執行在非保護模式下。由於應用的**不是被lua
呼叫的,
lua根據上下文情況來捕捉錯誤的發生(也就是說,
lua不能呼叫
setjmp
)。在這些情況下,當
lua遇到像
"not enough memory"
的錯誤,他不知道如何處理。他只能呼叫乙個
panic
函式退出應用。(你可以使用
lua_atpanic
函式設定你自己的
panic
函式)
不是所有的api
函式都會丟擲異常,
lua_open
、lua_close
、lua_pcall
和lua_load
都是安全的,另外,大多數其他函式只能在記憶體分配失敗的情況下丟擲異常:比如,
lual_loadfile
如果沒有足夠記憶體來拷貝指定的檔案將會失敗。有些程式當碰到記憶體不足時,他們可能需要忽略異常不做任何處理。對這些程式而言,如果
lua導致記憶體不足,
panic
是沒有問題的。
如果你不想你的應用退出,即使在記憶體分配失敗的情況下,你必須在保護模式下執行你的**。大部分或者所有你的lua
**通過呼叫
lua_pcall
來執行,所以,它執行在保護模式下。即使在記憶體分配失敗的情況下,
lua_pcall
也返回乙個錯誤**,使得
lua直譯器處於和諧的(
consistent
)狀態。如果你也想保護所有你的與
lua互動的
c**,你可以使用
lua_cpcall
。(請看參考手冊,有對這個函式更深的描述,在
lua的發布版的
lua.c
檔案中有它應用的例子)
MySql錯誤處理 錯誤處理的例子
有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not found 執行 rollback和產生一條錯誤...
swift 中錯誤處理
enum customerror error 定義乙個測試用的類 class testerrorclass name s func showstring 第一種使用方式,執行 後,直接丟擲異常,中止執行 let tes trytesterrorclass s 執行結果 lldb expr 123.c...
SPEL 中的錯誤處理
spel 中的錯誤處理 專案 目的 onerr 使用onerr語句定義錯誤處理例程的位置。err 使用err檢索當前錯誤狀態的數量。在錯誤處理例程中使用這個可以確定已經發生了哪些錯誤。error 生成乙個可被錯誤處理程式捕獲的使用者定義的錯誤。era 使用era檢索發生錯誤的軸號。這通常用於錯誤處理...