模板:TryError/doc
| File:Edit-copy green.svg | 此頁面是Template:TryError的模板文件。 此頁面可能包含了模板的使用說明、分類和其他內容。 |
| 警告 | 此模板文件被引用於約24,000個頁面。 為了避免造成大規模的影響,所有對此模板文件的編輯應先於沙盒、測試樣例或您的沙盒上測試。 測試後無誤的版本可以一次性地加入此模板文件中,但是修改前請務必於討論頁發起討論。 模板引用數量會自動更新。 |
概要[編輯]
本模板實現了try...catch...finally的結構
而若用{{#iferror:}}無法根據錯誤種類來做處不同處理,而若用嵌套解析器,對於部分高開銷操做是不利的,因此提供一個類似程式碼的方式來實現。而考量到en:Template:Try模板存在,因此仔不影響使用的情況以TryError命名。
參數及使用方法[編輯]
{{TryError
|<可能有錯誤的維基代碼>
|catch(<錯誤的class>)=<發生對應錯誤的處置>
|catch=<發生通用錯誤的處置>
|finally=<無論是否錯誤都會顯示的維基代碼>
}}
模板參數[編輯]
<templatedata> { "params": { "1": { "label": "可能有腳本錯誤的維基代碼", "description": "用來處理腳本錯誤的維基代碼", "example": "除以零。", "type": "string", "default": null, "autovalue": null,
"required": false
}, "catch": { "label": "代碼出現其他錯誤的錯誤訊息", "description": "若該代碼出現其他錯誤時才會輸出該錯誤訊息", "example": "出現不明錯誤", "type": "string", "default": null, "autovalue": null,
"required": false
}, "catch(類型)": { "label": "代碼出現特定類型錯誤的錯誤訊息", "description": "若該代碼出現某個指定類型的錯誤時才會輸出該錯誤訊息,而類型應該在括號裡指定", "example": "出現Lua腳本錯誤", "type": "string", "default": null, "autovalue": null,
"required": false
}, "finally": { "label": "不論代碼是否有錯都一定會出現的訊息", "description": "若該代碼不論是否有錯都一定會出現的內容", "example": "內容已除錯", "type": "string", "default": null, "autovalue": null,
"required": false
}
},
"description": "本模板用來輸出錯誤訊息到標準輸出,實現了try...catch...finally的結構", "format": "block" } </templatedata>
範例[編輯]
- 無錯誤的維基代碼搭配try...catch:
{{TryError
|無錯誤的維基代碼
|catch=
}}
無錯誤的維基代碼
- 移除有錯誤的維基代碼:
{{TryError
|這些{{#expr:0/0}}有錯誤
|catch={{{no error}}}
}}
- 輸出:
- 這些有錯誤
- 輸出:
- 有錯誤的維基代碼:
{{#expr:0/0}}{{link-wd|Q0/0}}
- 輸出:
- 除以零。Module:WikidataLink第216行Lua錯誤:attempt to call field 'entityExists' (a nil value)
- 輸出:
- 有錯誤的維基代碼搭配try...catch:
{{TryError
|{{#expr:0/0}}{{link-wd|Q0/0}}
|catch=
}}
- 輸出:
- 輸出:
- try...catch...finally
{{TryError
|{{#expr:0/0}}{{link-wd|Q0/0}}{{User 超電磁炮|level=1/0|name=零除錯誤|call=除錯}}{{Topic:Xo1mzbojtxmiusgl}}{{模板1}}
|catch=發生{{{message}}}錯誤!
|finally=結束
}}
- 輸出:
- 發生除以零。Module:WikidataLink第216行Lua錯誤:attempt to call field 'entityExists' (a nil value)除以零。無法嵌入結構式討論面板。檢測到模板循環:Template:模板1錯誤!結束
- 輸出:
- try並catch 「scribunto-error」錯誤和一般catch:
{{TryError
|{{#expr:0/0}}{{link-wd|Q0/0}}
|catch(scribunto-error)=發生{{{message}}}錯誤!
|catch=發生{{{message}}}錯誤!
|finally=結束
}}
- 輸出:
- 發生Module:WikidataLink第216行Lua錯誤:attempt to call field 'entityExists' (a nil value)錯誤!結束
- 輸出:
- try並提供空的一般catch:
{{TryError
|{{#expr:0/0}}{{link-wd|Q0/0}}
|catch=
|finally=結束
}}
- 輸出:
- 結束
- 輸出:
- try並throw:
{{TryError
|{{#expr:0/0}}{{link-wd|Q0/0}}
|catch(scribunto-error)={{{throw}}}
|finally=結束
}}
- 輸出:
- Module:WikidataLink第216行Lua錯誤:attempt to call field 'entityExists' (a nil value)結束
- 輸出:
- try並throw其他錯誤:
{{TryError
|{{#expr:0/0}}{{link-wd|Q0/0}}
|catch(scribunto-error)={{參數|throw|foo(throw其他錯誤)}}
|finally=結束
}}
- 輸出:
- throw其他錯誤結束
- 輸出:
- 巢狀try...catch:
{{TryError
|{{#expr:0/0}}{{link-wd|Q0/0}}{{TryError|{{#expr:0/0}}|catch={{參數|throw|foo(throw其他錯誤)}} }}
|catch(foo)=接到foo錯誤
|finally=結束
}}
- 輸出:
- 接到foo錯誤結束
- 輸出:
- 未能提供匹配的錯誤catch:
{{TryError
|{{#expr:0/0}}{{link-wd|Q0/0}}
|catch(foo)=接到foo錯誤
|finally=結束
}}
- 輸出:
- 未處理的例外狀況:除以零。Module:WikidataLink第216行Lua錯誤:attempt to call field 'entityExists' (a nil value)結束
- 輸出:
技術限制[編輯]
與#iferror一樣,本模板無法處理來自擴充功能標籤(如<math>...</math>)的錯誤
{{#iferror:<math>\你好</math>}}
- 輸出
- <math>\你好</math>
- 輸出
{{TryError
|<math>\你好</math>
|catch={{{no error}}}
}}
- 輸出
- <math>\你好</math>
- 輸出