“这里是云源祥IT,帮你轻松学IT”
嗨~今天过得怎么样?
人生的烦恼是无穷无尽的
幸福之所以短暂,是因为
就隐藏在解决此类麻烦的间隙中
你必须学会及时快乐,就像及时上班一样快乐
- 2023年5月10日 -
错误是编程过程的一部分。 无论你是菜鸟还是经验丰富的程序员,在编写程序的过程中都难免会出现一些错误。 作为菜鸟,我们应该站在巨人的腿上,学习如何预防这样的情况,以及如何在自己的项目中做到这一点。 更好的。
在 JavaScript 中,当代码语句紧密耦合并形成错误时,继续使用剩余的代码语句是没有意义的。 相反,我们应该尽可能优雅地从错误中恢复过来。
当发生此类错误时,JavaScript 解释器会检测异常处理代码,如果没有异常处理程序,程序将返回到导致错误的任何函数。 对调用堆栈上的每个函数重复此操作,直到找到异常处理程序或到达顶层函数,从而导致程序因错误而中止,从而导致程序崩溃。
一般来说,有两种处理方法:
1.抛出异常:如果运行时出现无法有意义处理的问题,最好抛出它
函数 openFile(文件名) {
if (!exists(文件名)) {
抛出新错误('文件未找到'+文件名)
// ...
2. 捕获异常:抛出异常在运行时被捕获并处理,这样更有意义
尝试 {
openFile('../test.js')
} 捕获(e){
// 优雅地处理抛出的期望
接下来我们就详细的讲一下这两种异常处理方法的具体操作。
1. 抛出异常
您可能会看到类似ReferenceError:规格未定义的内容。 这表示由 throw 语句引起的异常。
语法
投掷值
// 不要这样做
如果(发生了一些坏事){
抛出“发生了不好的事情”
对于可以作为异常抛出的数据类型没有限制,但 JavaScript 有特殊的外部异常类型。 其中之一是错误,如上例所示。 这些外部异常类型为我们提供了比异常消息更多的详细信息。
错误
Error 类型用于表示一般异常。 这种类型的异常最常用于实现用户定义的异常。 它有两个可用的外部属性。
const myError = new Error('错误!!!')
console.log(myError.message) // 错误!!!
错误:错误!!!
于:1:1
注意:new Error('...') 在抛出之前不会执行任何操作,即 throw new Error('error msg') 会在 JavaScript 中创建一个 Error 实例并停止脚本的执行,除非您执行单独的操作发生错误,例如捕获它。
2. 捕获异常
现在我们知道什么是异常以及如何抛出它们,让我们讨论如何通过捕获它们来阻止它们破坏我们的程序。
try-catch-finally 是处理异常最简单的方法。
尝试 {
// 要运行的代码
} 捕获 (e) {
// 发生异常时运行的代码
[ // 选修的
最后 {
// 无论异常如何,始终执行的代码。
在try子句中,我们添加了可能引发异常的代码。 如果发生异常,则执行 catch 子句。
有时,无论代码是否引发异常,都需要执行代码,那么我们可以使用可选的finally块。 即使 try 或 catch 子句执行了 return 语句,finally 块也会执行。 例如,以下函数返回“Execute finally”,因为finally子句是最后执行的事情。
函数 foo() {
尝试 {
返回真
} 最后 {
console.log('最后执行')
当无法提前检查代码的正确性时,我们使用 try-catch。
const user = '{“姓名”:“DO”,“年龄”:18}'
尝试 {
// 要运行的代码
JSON。 解析(参数)
// 如果发生错误,其余代码将永远不会运行
安慰。 日志(参数)
} 捕获(错误){
// 特殊情况下运行的代码
console.log(err.message) // 参数未定义
如上所示,在执行代码之前不可能使用 JSON.parse 来对对象或字符串进行字符串化。
注意:您可以捕获编程和运行时异常,但不能捕获 JavaScript 语法错误。
try-catch-finally 只能捕获同步错误。 如果我们尝试将其用于异步代码,try-catch-finally 可能会在异步代码完成执行之前很久就执行。 那么我们如何处理异步代码块中的异常呢? 下面给大家介绍三种方式:
3. 如何处理异步代码块中的异常
打回来
使用回调函数(不推荐),我们一般接收两个参数如下:
异步函数(代码,(错误,结果)=> {
如果(错误)返回console.error(错误)
安慰。 日志(结果)
})
我们可以看到有两个参数:err和result。 如果出现错误,err 参数将等于错误,我们可以将其抛出以进行异常处理。
在 if (err) 块中返回单个内容或将其他指令包装在 else 块中非常重要。 否则,您可能会遇到另一个错误。 例如,当您尝试访问 result.data 时,结果可能是未定义的。
承诺
使用 then 或 catch of Promise,我们可以通过将错误处理程序传递给 then 方法或使用 catch 子句来处理错误。
Promise.then(onFulfilled, onRejected)
您还可以使用 .catch(onRejected) 而不是 .then(null, onRejected) 添加错误处理程序,其工作方式相同。
让我们看一下 .catch 拒绝 Promise 的反例。
承诺。 解决('1')
.then(res => {
安慰。 日志(res) // 1
throw new Error('出错') // 抛出异常
})
.then(res => {
console.log(res) // 不会被执行
})
.catch(错误=> {
console.error(err) //捕获并处理异常——> Error: 出错
})
使用 async/await 和 try-catch
使用 async/await 和 try-catch-finally,处理异常是小菜一碟。
异步函数 func() {
尝试 {
等待不存在的函数()
} 捕获(错误){
console.error(err) // ReferenceError: nonExistentFunction 未定义
现在我们已经很好地了解了如何在同步和异步代码块中进行异常处理,最后我们来看看如何处理未捕获的异常?
4. 如何处理未捕获的异常
也分为两种情况:在浏览器中和在Node.js中。 该异常可根据实际情况进行处理。
在浏览器中
我们可以使用 window.onerror() 方法来处理未捕获的异常。 每当运行时发生错误时,此方法都会触发窗口对象上的错误事件。
onerror()的另一个实际用途是:当站点中加载图片或视频等数据出现错误时,可以使用该方法来触发个别操作。 例如javascript 限制输入,提供加载错误的图像或显示消息。
在 Node.js 中
从EventEmitter模块派生的流程对象可以订阅uncaughtException。
process.on('uncaughtException', () => {})`
我们可以通过一个反弹来处理异常。 如果我们尝试捕获这个未捕获的异常,该过程将不会中止,因此我们必须自动执行此操作。
uncaughtException 仅适用于同步代码。 对于异步代码,还有另一种风暴,称为unhandledRejection。
process.on('unhandledRejection', () => {})
切勿尝试为基本错误类型实现“包罗万象”的处理程序。 这会让正在发生的一切变得混乱,并损害代码的可维护性和可扩展性。
5. 要点
在实际的JavaScript项目开发过程中,当我们遇到异常代码时javascript 限制输入,不要以为很麻烦。 异常处理可以帮助您增强代码的可维护性、可扩展性和可读性。
发表评论