模板: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>
- 输出