首先,一个好的框架必须要有一个功能强大的错误处理函数,如果每次都需要用户手动的进行try和catch的话会极为不便。
于是我们便可以设计出如下的包装后的错误处理函数。
//utils.js
export defaule {
foo(fn) {
try{
fn && fn()
}catch(e) {
/*... */
}
},
bar(fn) {
try{
fn && fn()
}catch(e) {
/*... */
}
},
}
//进一步的封装
export defaule {
foo(fn) {
callWithErrorHandling(fn)
},
bar(fn) {
callWithErrorHandling(fn)
},
}
function callWithErrorHandling(fn) {
try{
fn && fn()
}catch(e) {
console.log(e)
}
}
但是这总处理方法仍然存在问题,那就是对于错误的处理并不能动态的去设置(如上述代码中已经确定了对于错误的处理就是打印出错误信息),因此还需向用户暴露出一个设置错误处理的函数。
let handleError = null
export defaule {
foo(fn) {
callWithErrorHandling(fn)
},
bar(fn) {
callWithErrorHandling(fn)
},
//用来设置错误处理函数
registerErrorHandler(fn) {
handleError = fn
}
}
function callWithErrorHandling(fn) {
try{
fn && fn()
}catch(e) {
handleError(e)
}
}
//具体使用
import utils from './utils.js'
utils.registerErrorHandler((e) => {
console.log(e)
//也可以根据需要设置不同的处理方式
})
utils.foo(() => {
/* */
})
这样的话对于错误的处理是不是就更加灵活了呢,嘻嘻。