编程语言将需要一个全面的错误处理策略来使应用程序更合理地运行错误。服务端的错误处理比较完善,但是浏览器端的进度比较慢,而且不同浏览器的错误处理方式也不同,默认的错误处理方式不够人性化。因此,了解捕获和处理错误的各种方法很重要。在ECMA-262第三版中,加入了try-catch语句块和throw语句来处理错误,以及一些错误类型来描述错误。try-catchECMA-262新的错误处理方式与Java类似。可能出错的代码放在try子句中,处理错误的代码放在catch子句中:try{//可能的错误代码}catch(e){//ErrorHandler}中捕获的错误对象catch子句包含有关错误的相关信息。通过这个错误对象,可以得到错误类型的name属性和保存错误信息的message属性,调用e.message。使用try-catch块时,知道何时最好使用它们。如果出现不可控的错误,需要使用try-catch语句块来处理错误;如果知道代码中会出现某种错误,就必须使用相应的操作来阻止错误的发生,而不是使用try-catch语句块来处理错误。处理错误。finally在try-catch语句块中,无论是执行try子句还是执行catch子句,finally子句中的代码都可以执行,try和catch都不能阻止,包括return语句。函数测试(){尝试{返回1;}catch(e){抛出e;}最后{返回假;}}上面的方法最终会返回false。注意:重要的是要理解,如果finally子句包含在主代码中,则try块或catch块中的return语句将被忽略。使用finally时一定要仔细确认你的代码的行为。抛出错误使用throw抛出错误是另一种错误处理形式。throw抛出任何表达式。如下图:throw"NotValueError";//字符串类型errorthrow31;//数字类型errorthrowfalse;//布尔类型errorthrow{name:"JavaScript"};//对象类型error也可以调用Error构造函数来生成一个抛出的错误对象,接收到的值就是错误信息。如下:thrownewError("NullvalueError.");您还可以调用特定的错误类型来生成错误对象并将其抛出。如SyntaxError、TypeError等。也可以使用ES6中的继承语法创建错误类型,需要提供name属性和message属性。如下:classCustomErrorextendsError{constructor(message){super(message);this.name="自定义错误";this.message=消息;}}thrownewCustomError("空值错误");这种方式有助于在捕获错误时更准确地区分错误。ErrorError错误类型是基本类型,其他错误类型基本继承自该类型。Error提供了一个构造函数来创建一个实例对象。当错误发生时,Error通过构造函数创建一个实例对象并抛出。thrownewError("空值错误");Error错误类型提供三个属性:名称:字符串类型。指示错误名称。消息:字符串类型。指示错误消息。栈:字符串类型。指示错误的堆栈。ECMA-262一共定义了8种错误类型。除了一般的Error类型外,还有以下类型:EvalError:当使用eval()函数发生错误时将抛出该错误类型。InternalError:这种错误类型主要是在底层JavaScript引擎抛出异常时由浏览器抛出。如果递归过多导致栈溢出。通常不是要处理的错误。RangeError:当数字变量或参数超出范围时抛出此错误类型。ReferenceError:引用无效时抛出该错误类型。SyntaxError:这种错误类型发生在eval()解析代码期间。TypeError:当变量或参数不是预期的类型,或者访问不存在的方法时,会抛出此错误类型。URIError:这种错误类型只会在使用encodeURI()或decodeURI()并且传入的URI格式不正确时发生。浏览器很少抛出Error类型的错误,主要是开发者抛出的自定义错误。其他错误类型可以使用instanceof来判断。像这样:try{//可能的错误代码}catch(e){if(einstanceofTypeError){//类型错误处理程序}elseif(einstanceofReferenceError){//引用错误处理程序}else{//其他错误处理程序}}error事件try-catch没有捕捉到的错误会触发window对象上的error事件。该事件会传入3个参数:message:错误信息。url:发生错误的URL。line:错误的行号。colno:错误的列号。错误:错误对象。window.onerror=(message,url,line,colno,error)=>{//你可以处理错误信息,这里会打印到控制台console.log(message);返回假;//此处返回false防止浏览器默认报错};通过返回false,该函数有效地成为整个文档的try/catch语句,捕获所有未处理的运行时错误。正确的try-catch块意味着没有错误到达浏览器级别,因此不会触发错误事件。为真时,阻止执行默认事件处理程序。但是,如果某些资源加载失败,则会触发错误事件,遵循DOM格式。所以它可以使用addEventListener来捕获。constimage=newImage();image.addEventListener("error",(event)=>{console.log("Imagenotloaded!");});image.src="resource.gif";//不存在则资源加载失败。总结设计良好的错误处理对于编程语言来说非常重要。JavaScript提供了try-cath和throw两种方式来处理错误。但是,这两种错误处理方法有不同的错误场景要求。如果您编写的库或函数需要确切知道错误发生的原因,请抛出异常;如果您确切地知道下一步该做什么,请捕获错误。try-catch未处理的错误可以使用window.onerror事件处理。更多内容请关注公众号《海人的故事》
