关于前端防御性编程,我们可能遇到过大多数情况,后端由于并发请求太多,或者数据量太大,或者服务被异常由于异常,接口请求失败,然后前端出现白屏或者报错。前端自己写的代码有一些缺陷,整个系统不够健壮,所以会出现白屏,或者业务系统异常,用户误操作等,然后就会出现。前端防御性编程常见问题及预防1、最常见的问题:未捕获的TypeError:Cannotreadproperty'c'ofundefined出现这个问题最根本的原因是:当我们将一个对象obj初始化为{}时,obj.a此时,它是未定义的。我们可以通过打印obj.a得到undefined,但是当我们打印obj.a.c时,就会出现上面的错误。js对象中未初始化的属性值为undefined,从undefined中读取属性会出现这个错误(同理,null也是一样)。如何避免?js和ts目前都有可选链的概念,例如:constobj={};console.log(obj?.b?.c?.d)上面的代码不会报错,原因是什么时候?.遇到空值,会返回undefined。2.前端接口层面的错误机制捕获前端接口调用一般比较频繁。这时候我们可以考虑使用单例模式,将所有的axios请求都封装成一个函数。在此函数中调用接口时,Unity可以捕获未知错误。伪代码如下:functionajax(url,data,method='get'){constpromise=axios[method](url,data)returnpromise.then(res=>{}).catch(error){//统一错误处理}}那么只要出现接口调用的未知错误,都会在这里处理。3.错误边界(ErrorBoundaries,当前端出现未知错误时,预设的DefinedUI界面)以React为例,部分UI的JavaScript错误不应该导致整个应用崩溃。为了解决这个问题,React16引入了一个新的概念——错误边界。错误边界是一个React组件,它捕获并打印在其子组件树中任何位置发生的JavaScript错误,并呈现替代UI而不是呈现那些崩溃的子组件树。错误边界在渲染期间、生命周期方法中以及整个组件树的构造函数中捕获错误。用法示例:classErrorBoundaryextendsReact.Component{constructor(props){super(props);this.state={hasError:false};}staticgetDerivedStateFromError(error){//更新状态,以便下一次渲染可以显示降级的UIreturn{hasError:true};}componentDidCatch(error,errorInfo){//也可以将错误日志上报给服务端logErrorToMyService(error,errorInfo);}render(){if(this.state.hasError){//您可以自定义降级的UI并渲染return
