Day 25 - Exception Handling

首先来认识常见的错误类型:

  • EvalError - eval() 执行错误
  • RangeError - 一个数值超过允许范围
  • ReferenceError - 未宣告的变数
  • SyntaxError - 程序语法错误
  • TypeError - 型别错误

当错误发生时,JavaScript 会停止执行,并产生错误讯息,通常会使用 try catch 搭配 throw 来建立自定义的错误讯息,而在 try catch 里只能处理同步的错误,非同步处理错误将会在下一篇做介绍。

try...catch...finally

try 一定要搭配 catch 或 finally 来做使用,例如:try...catch or try...finally or try...catch...finally

语法:

try {

   // 要执行的程序码(预期可能会发生错误的程序码)
   // 如果发生错误,就停止 try 的程序码,并将 error 抛给 catch 来处理

} catch (error) {

   // 捕捉错误,若没有错误,此区块也可以省略
   // 当 try 抛出 error 时,就执行 catch 区块里的程序码
   // catch 区块的参数为一个 Error object
   // Error object 有两个属性:name 和 message,name 为错误类型,message 为错误讯息

} finally {

    // 可以省略 finally 区块
    // 无论最後结果如何,最後 finally 区块的程序码都会被执行
    // (即使 try 或 catch 区块有 return,也阻止不了 finally 区块的执行)

}

例如:

try {
  console.log(abc);
} catch (err) {
  console.log(err.name);
  console.log(err.message);
} finally {
  console.log("程序码执行结束");;
}
// ReferenceError
// abc is not defined
// 程序码执行结束

上面的例子因为没有宣告 abc 这个变数,找不到 abc,所以在 try 区块里,就会抛出错误讯息给 catch 区块,这时候查看 catch 的错误讯息就可以看到错误类型为 ReferenceError,错误讯息为 abc is not defined,而最後会执行 finally 区块里的程序码:程序码执行结束。

throw

  • throw new Error()
    可以利用 constructor 建立自定义的 Error object,这个方法可以让浏览器像处理自己生成的错误一样来处理这行程序码抛出的错误,而所有的例外错误都继承这个 Error object。

例如:

throw new Error("This is Error message.")

这时候我们查看 Devtool 可以发现这个错误讯息变成我们自己定义的内容了
https://ithelp.ithome.com.tw/upload/images/20210926/20140282EdpHHPZhcI.jpg

也可以改变错误类型的预设讯息,例如:

try {
  throw new ReferenceError("请不要忘记宣告变数");
  console.log(abc);
} catch (err) {
  console.log(err);
} finally {
  console.log("程序码执行结束");;
}

https://ithelp.ithome.com.tw/upload/images/20210926/20140282u5t8Nv0ywu.jpg

  • throw expression
    抛出错误时,必须在 throw 後面放一个值来指定错误讯息,而这个值的类型不限,可以是 String, Number, Boolean, object...等。

例如:

try {
  throw 'error message';
} catch (err) {
  console.log(err); // error message
  console.log(err.name); // undefined
  console.log(err.message); // undefined
}

上面的例子要注意的是,因为建立的错误讯息是字串,所以这时候的错误讯息不是一个 Error object,没有 name 和 message 属性,查看 name 和 message 的时候就会显示 undefined。

参考资料:
错误与例外处理 - 从ES6开始的JavaScript学习生活
流程控制与例外处理 - MDN


<<:  Day11 - 使用 Rails Routes 识别用户输入

>>:  时间挤一下就有了,我们挤了没?

Day 27. B2E-密码加密

还记得第2天在做专案规划时,有提到一个目标「加密敏感资料实现资安管理」吗? 目前我们的密码还是一样...

Day 29:案例探讨1 - Use Cases (Bayer/Adobe/IEEE)

看了ElasticSearch的成功案例,说实在的,30天的确只有了解ElasticSearch平台...

在 Fedora 34 上安装 VirtualBox 6.1.26

我整理一下自己的安装步骤如下: 一、升级 Kernel sudo -i dnf check-upd...

[Day4] 找出你的受众目标

首先,在开始一个好的设计之前, 如同广告投放一般, 我们需要找出目标受众来设计出更符合他们的对话流程...

终端执行py.ipynb档

这里用来纪录最近的发现 在终端(window+R -> cmd)执行jupyter noteb...