try
语法
try EXPRESSION
返回值
TryValue
try
语句是 Go 的 text/template 包的非标准扩展。它引入了一种在模板中处理错误的机制,模仿其他编程语言中的 try-catch
结构。
方法
TryValue
对象封装了表达式的计算结果,并提供了两个方法
- Err
- (
string
) 返回表达式抛出的错误的字符串表示形式(如果发生错误),或者如果表达式在没有错误的情况下求值,则返回nil
。 - Value
- (
any
) 如果求值成功,则返回表达式的结果;如果求值表达式时发生错误,则返回nil
。
说明
举例来说,让我们用一个数除以零
{{ $x := 1 }}
{{ $y := 0 }}
{{ $result := div $x $y }}
{{ printf "%v divided by %v equals %v" $x $y .Value }}
正如预期的那样,上面的例子抛出一个错误并导致构建失败
Error: error calling div: can't divide the value by 0
与其让构建失败,我们可以捕获错误并发出警告
{{ $x := 1 }}
{{ $y := 0 }}
{{ with try (div $x $y) }}
{{ with .Err }}
{{ warnf "%s" . }}
{{ else }}
{{ printf "%v divided by %v equals %v" $x $y .Value }}
{{ end }}
{{ end }}
表达式抛出的错误将作为警告记录到控制台
WARN error calling div: can't divide the value by 0
现在让我们更改参数以避免除以零
{{ $x := 42 }}
{{ $y := 6 }}
{{ with try (div $x $y) }}
{{ with .Err }}
{{ warnf "%s" . }}
{{ else }}
{{ printf "%v divided by %v equals %v" $x $y .Value }}
{{ end }}
{{ end }}
Hugo 将以上内容渲染为
42 divided by 6 equals 7
示例
当使用 resources.GetRemote
函数捕获远程资源(例如数据或图像)时,错误处理至关重要。当调用此函数时,如果 HTTP 请求失败,Hugo 将使构建失败。
与其让构建失败,我们可以捕获错误并发出警告
{{ $url := "https://broken-example.org/images/a.jpg" }}
{{ with try (resources.GetRemote $url) }}
{{ with .Err }}
{{ warnf "%s" . }}
{{ else with .Value }}
<img src="{{ .RelPermalink }}" width="{{ .Width }}" height="{{ .Height }}" alt="">
{{ else }}
{{ warnf "Unable to get remote resource %q" $url }}
{{ end }}
{{ end }}