Skip to content

错误处理

过滤器本质上就是一个简单的函数(value)=>{},当执行过滤器出错时,可以配置错误处理函数来处理错误。

错误处理函数

当过滤器执行出错时,可以通过指定onError函数来处理错误。

可以通过三个方式指定onError函数:

  • flexvars.options.onError:全局错误处理函数
  • flexvars.filters.<过滤器>.onError: 指定过滤器的错误处理函数,优先级高于全局错误处理函数
  • 错误处理过滤器: 直接在插值变量中使用error过滤器即可,例如:{name | error | upper}, 优先级最高,并且在过滤器链中可以放在任意位置,如{ |add|error|add|add|add},{ |add|add|add|add|error },{ |error|add|add|add|add },{ |add|add|add|error|add }等效的。

onError函数签名如下:

ts
export type FilterErrorHandler = (this:FlexVars,error:Error,value:any,args:Record<string,any>,context:FlexVariableContext)=>FilterBehaviorType | string;

忽略错误

忽略错误并继续执行后续过滤器, 可以有两种处理方式:

  • 直接忽略

直接忽略错误,继续执行后续过滤器。

ts
// `add`是一个对输入转换为数字加`1`的过滤器。`throw`过滤器会抛出错误。
flexvars.options.onError = (error,value,args,context)=>FilterBehaviors.Ignore
expect(flexvars.replace("{|add|add|throw|add|add}",0)).toBe("4")
xpect(flexvars.replace("{|throw}",0)).toBe("0")

以上例子中,throw过滤器抛出错误被忽略,后续继续执行add过滤器,因此返回值为4

  • 忽略并返回值

忽略错误时返回一个值来代替执行链中的值输入到下一个过滤器中,然后继续执行后续过滤器。

ts
// `add`是一个对输入转换为数字加`1`的过滤器。`throw`过滤器会抛出错误。
flexvars.options.onError = ()=>{
    throw new FlexFilterIgnoreError("999")
}
expect(flexvars.replace("{|add|add|throw|add}",0)).toBe("1000")

以上例子中,执行|add|add后,值为2,然后throw错误后,值为999,最后执行|add过滤器,值为1000

中止错误

终止后续过滤器的执行并返回当前值,同样有两种处理方式:

  • 直接中止

直接中止后续过滤器的执行并返回当前值。

ts
// `add`是一个对输入转换为数字加`1`的过滤器。`throw`过滤器会抛出错误。
expect(flexvars.replace("{|add|add|throw|add|add}",0)).toBe("2")

以上例子中,throw过滤器抛出错误,终止后续过滤器的执行,最后成功执行的过滤器是第二个add过滤器,因此返回值为2

  • 中止并返回值
ts
// `add`是一个对输入转换为数字加`1`的过滤器。`throw`过滤器会抛出错误。
flexvars.options.onError = ()=>{
    throw new FlexFilterAbortError("999")
}
expect(flexvars.replace("{|add|add|throw|add}",0)).toBe("999")

抛出错误

当过滤器执行出错时,可以抛出错误,抛出的错误会被flexvars.replace函数捕获并抛出。

ts
flexvars.addFilter({
    name:"throw",
    next(value,args,context){
        throw new MyError("出错了")
    }
})
flexvars.onError = ()=>FilterBehaviors.Throw
expect(()=>flexvars.replace("{|add|add|throw|add|add}",0)).toThrow(MyError)

默认错误行为

执行过滤器出错时,默认行为是FilterBehaviors.Ignore,即忽略错误并继续执行后续过滤器。

处理示例

更多的示例详见单元测试用例