文章目录
throw 语句:
throw语句
用来抛出一个用户自定义的异常。
当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch块。
如果调用者函数中没有catch块,程序将会终止。
throw "Error2"; // 抛出了一个值为字符串的异常
throw 42; // 抛出了一个值为整数42的异常
throw true; // 抛出了一个值为true的异常
function getRectArea(width, height) {
if (isNaN(width) || isNaN(height)) {
throw 'Parameter is not a number!';
}
}
try {
getRectArea(3, 'A');
} catch (e) {
console.error(e);
// "Parameter is not a number!"
}
try 语句:
try...catch
:语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。
catch(e)
中的参数e
: 用来保存被抛出声明指定的值。你可以用这个标识符来获取关于被抛出异常的信息
try { // 书写可能会抛出异常的语句
nonExistentFunction();
} catch (error) { // try 抛出异常时触发
console.error(error);
// 预期输出:ReferenceError: nonExistentFunction未定义
// 注意:错误消息将根据浏览器的不同而不同
}
openMyFile() // 打开一个文件
try { // 书写可能会抛出异常的语句
// 占用资源
writeMyFile(theData); // 操作文件
}finally { // try 抛出异常或没有异常都会触发
closeMyFile(); // 总是关闭文件
}
try { // 书写可能会抛出异常的语句
throw "myException"; // 生成一个异常
}catch (e) { // try 抛出异常时触发
// catch 语句用来处理任何异常
logMyErrors(e); // 将异常对象传递给错误处理程序
}finally { // try 抛出异常或没有异常都会触发
console.log("finally 执行了"); // finally 总是会执行
}
嵌套用法:
try {
myRoutine();
} catch (e) {
if (e instanceof RangeError) {
// 语句来处理这个非常常见的预期错误
} else {
throw e; // 重新抛出错误
}
}
try {
try {
throw new Error("oops");
}
finally {
console.log("finally");
}
}
catch (ex) {
console.error("outer", ex.message);
}
/* 预期输出 */
// "finally"
// "outer" "oops"
在 try 语句中,通过增加一个 catch 语句块捕获了异常
try {
try {
throw new Error("oops");
}
catch (ex) {
console.error("inner", ex.message);
}
finally {
console.log("finally");
}
}
catch (ex) {
console.error("outer", ex.message);
}
/* 预期输出 */
// "inner" "oops"
// "finally"
在 try 语句中,嵌套的 catch 语句块再次抛出错误
try {
try {
throw new Error("oops");
}
catch (ex) {
console.error("inner", ex.message);
throw ex;
}
finally {
console.log("finally");
}
}
catch (ex) {
console.error("outer", ex.message);
}
/* 预期输出 */
// "inner" "oops"
// "finally"
// "outer" "oops"