首页 > 编程语言 >JavaScript进阶09笔记

JavaScript进阶09笔记

时间:2023-06-26 16:22:07浏览次数:31  
标签:语句 JavaScript 进阶 抛出 09 try finally catch throw

错误处理

异常处理语句

你可以用 throw 语句抛出一个异常并且用 try...catch 语句捕获处理它。

  • throw语句

  • try...catch语句

异常类型

JavaScript 可以抛出任意对象。然而,不是所有对象能产生相同的结果。尽管抛出数值或者字母串作为错误信息十分常见,但是通常用下列其中一种异常类型来创建目标更为高效:

  • ECMAScript exceptions

  • DOMException and DOMError

 

throw 语句

使用throw语句抛出一个异常。当你抛出异常,你规定一个含有值的表达式要被抛出。

throw expression;

你可以抛出任意表达式而不是特定一种类型的表达式。下面的代码抛出了几个不同类型的表达式:

throw "Error2";   // String type
throw 42;         // Number type
throw true;       // Boolean type
throw {toString: function() { return "I'm an object!"; } };

备注: 你可以在抛出异常时声明一个对象。那你就可以在 catch 块中查询到对象的属性。

// Create an object type UserException
function UserException (message){
 this.message=message;
 this.name="UserException";
}

// Make the exception convert to a pretty string when used as
// a string (e.g. by the error console)
UserException.prototype.toString = function (){
 return this.name + ': "' + this.message + '"';
}

// Create an instance of the object type and throw it
throw new UserException("Value too high");

 

try...catch语句

try...catch 语句标记一块待尝试的语句,并规定一个以上的响应应该有一个异常被抛出。如果我们抛出一个异常,try...catch语句就捕获它。

  • 如果你在 try 代码块中的代码如果没有执行成功,那么你希望将执行流程转入 catch 代码块。

  • 如果 try 代码块中的语句(或者try 代码块中调用的方法)一旦抛出了异常,那么执行流程会立即进入catch 代码块。

  • 如果 try 代码块没有抛出异常,catch 代码块就会被跳过。

finally 代码块总会紧跟在 try 和 catch 代码块之后执行,但会在 try 和 catch 代码块之后的其他代码之前执行。

 

下面的例子使用了try...catch语句。示例调用了一个函数用于从一个数组中根据传递值来获取一个月份名称。如果该值与月份数值不相符,会抛出一个带有"InvalidMonthNo"值的异常,然后在捕捉块语句中设monthName变量为unknown

function getMonthName(mo) {
 mo = mo - 1; // Adjust month number for array index (1 = Jan, 12 = Dec)
 var months = ["Jan","Feb","Mar","Apr","May","Jun","Jul",
               "Aug","Sep","Oct","Nov","Dec"];
 if (months[mo]) {
   return months[mo];
} else {
   throw "InvalidMonthNo"; //throw keyword is used here
}
}

try { // statements to try
 monthName = getMonthName(myMonth); // function could throw exception
}
catch (e) {
 monthName = "unknown";
 logMyErrors(e); // pass exception object to error handler -> your own function
}

 

catch

你可以使用catch块来处理所有可能在try块中产生的异常。

catch (catchID) {
 statements
}

捕捉块指定了一个标识符(上述语句中的catchID)来存放抛出语句指定的值;你可以用这个标识符来获取抛出的异常信息。在插入throw块时 JavaScript 创建这个标识符;标识符只存在于catch块的存续期间里;当catch块执行完成时,标识符不再可用。

 

举个例子,下面代码抛出了一个异常。当异常出现时跳到catch块。

try {
  throw "myException" // generates an exception
}
catch (e) {
// statements to handle any exceptions
  logMyErrors(e) // pass exception object to error handler
}

 

finally

finally块包含了在 try 和 catch 块完成后、下面接着 try...catch 的语句之前执行的语句。finally块无论是否抛出异常都会执行。如果抛出了一个异常,就算没有异常处理,finally块里的语句也会执行。

你可以用finally块来令你的脚本在异常发生时优雅地退出;举个例子,你可能需要在绑定的脚本中释放资源。接下来的例子用文件处理语句打开了一个文件(服务端的 JavaScript 允许你进入文件)。如果在文件打开时一个异常抛出,finally块会在脚本错误之前关闭文件。

openMyFile();
try {
   writeMyFile(theData); //This may throw a error
}catch(e){
   handleError(e); // If we got a error we handle it
}finally {
   closeMyFile(); // always close the resource
}

如果finally块返回一个值,该值会是整个try-catch-finally流程的返回值,不管在trycatch块中语句返回了什么:

function f() {
 try {
   console.log(0);
   throw "bogus";
} catch(e) {
   console.log(1);
   return true; // this return statement is suspended
                // until finally block has completed
   console.log(2); // not reachable
} finally {
   console.log(3);
   return false; // overwrites the previous "return"
   console.log(4); // not reachable
}
 // "return false" is executed now
 console.log(5); // not reachable
}
f(); // console 0, 1, 3; returns false

finally块覆盖返回值也适用于在catch块内抛出或重新抛出的异常

function f() {
try {
throw 'bogus';
} catch(e) {
console.log('caught inner "bogus"');
throw e; // this throw statement is suspended until
// finally block has completed
} finally {
return false; // overwrites the previous "throw"
}
// "return false" is executed now
}

try {
f();
} catch(e) {
// this is never reached because the throw inside
// the catch is overwritten
// by the return in finally
console.log('caught outer "bogus"');
}

// OUTPUT
// caught inner "bogus"

 

Error对象

根据错误类型,你也许可以用'name'和'message'获取更精炼的信息。'name'提供了常规的错误类(如 'DOMException' 或 'Error'),而'message'通常提供了一条从错误对象转换成字符串的简明信息。

 

在抛出你个人所为的异常时,为了充分利用那些属性(比如你的catch块不能分辨是你个人所为的异常还是系统的异常时),你可以使用 Error 构造函数。比如:

function doSomethingErrorProne () {
 if (ourCodeMakesAMistake()) {
   throw (new Error('The message'));
} else {
   doSomethingToGetAJavascriptError();
}
}
....
try {
 doSomethingErrorProne();
}
catch (e) {
 console.log(e.name); // logs 'Error'
 console.log(e.message); // logs 'The message' or a JavaScript error message)
}

标签:语句,JavaScript,进阶,抛出,09,try,finally,catch,throw
From: https://www.cnblogs.com/zjy1020/p/17505999.html

相关文章

  • JavaScript学习 -- 高阶函数
    一、普通函数比较大小写声明函数判断大于或小于数组中的某个数letarr=[1,2,3,4,5,6,7,8,9]functionaiyou(a){for(leti=0;i<arr.length;i++){if(arr[i]>a){console.log(arr[i])}}console.log("****************************")}functionbucuo(a){for(......
  • 像大神一样玩转JavaScript
    前言众所周知,JavaScript是一种非常流行的编程语言,它已经成为了网页开发的必备技能。但是,在我们从事JavaScript编程的时候,我们却没有完全发掘和利用它的全部潜力。在本文中,我们将分享一些高级的JavaScript技巧,希望帮助掘友们更好地理解和掌握JavaScript编程。关于JS高级用法在学习Ja......
  • JavaScript、vue、uniapp如何获取本周开始时间和结束时间?
    //获得本周的开始时间: getStartDayOfWeek(time){ letnow=newDate(time);//当前日期 letnowDayOfWeek=now.getDay();//今天本周的第几天 letday=nowDayOfWeek||7; letnowDay=now.getDate();//当前日 letnowMonth=now.getMonth();//......
  • JavaScript program to check if a given year is leap year Javascript判断是否是闰
    Ayearisleapyeariffollowingconditionsaresatisfied:Yearismultipleof400.Yearismultipleof4andnotmultipleof100.Approach: Getthevalueofinputfieldbyusingdocument.getElementById(“year”).valueCheckthegivenyearisleapyear......
  • JavaScript1.8.5新特性系列Object.keys
    以前在js-object这个分类里面也写过keys相关的api 在JavaScript1.8.5中,加入了原生的Object.keys这个api  Object.keys(obj);/*简单举例*/Object.keys({"A":"a","B":"b"});//["A","B"]兼容性写法:  if(!Object.keys){Object.keys=......
  • Linux多线程09-互斥锁
    为避免线程更新共享变量时出现问题,可以使用互斥量(mutex是mutualexclusion的缩写)来确保同时仅有一个线程可以访问某项共享资源。可以使用互斥量来保证对任意共享资源的原子访问。互斥量有两种状态:已锁定(locked)和未锁定(unlocked)。任何时候,至多只有一个线程可以锁定该互斥量。试......
  • [WP] 攻防世界 CSFJ0981 流量分析2
    「附件」题目描述:流量分析,你知道完整内容是什么吗(请关注流量包本身,和对应网址的内容无关)「思路」使用wireshark打开流量包进行观察,发现可疑文件test.txt使用Ctrl+F,选择分组字节流,查找test.txt根据test.txt出现的规律,筛选SourceIP为192.168.43.109的HTTP包,筛选器:ip.src==......
  • [WP] 攻防世界 CSFJ0967 Let_god_knows
    「附件」题目描述:让苍天知道,你不认输?附件下载解压,得到一个bmp图片「思路」使用Stegsolve找图片隐写,在Redplane0中发现清晰二维码。CQR扫码得到flag。「工具」StegsolveCQR「知识拓展」转载:官方WP出题思路使用传统图片隐写方法LSBS,将270270px的二维码图片分解......
  • ActiveX 控件在过去是非常流行的技术,但近年来已经逐渐被其他技术所取代。由于其局限性
    ActiveX控件是一种可重用的软件组件,它们基于微软的COM(ComponentObjectModel)技术,并被广泛应用于Windows平台上的应用程序开发。ActiveX控件可以包含图形用户界面元素、功能模块、数据处理等,并提供给其他应用程序使用。下面是关于ActiveX控件的一些常见信息:安装和注册:使用A......
  • 强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函
    强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)1.核心词汇策略(policy):在每一个演员中会有对应的策略,这个策略决定了演员的后续动作。具体来说,策略就是对于外界的输入,输出演员现在应该要执行的动作。一般地,我......