Javascript 嵌套异常处理

标签 javascript exception error-handling

我尝试了几个关于使用嵌套 try..catch 在 javascript 中进行异常处理的示例。内部 try block 中的代码抛出错误,但不是内部 catch block 处理代码,异常是由外部 catch block 捕获的。我没看懂那部分

这是我在 MDN 文档上阅读的,但它与我尝试的示例不符:

“任何给定的异常只会被最近的封闭捕获 block 捕获一次 除非它被重新抛出。当然,“内部” block 中引发的任何新异常(因为 catch block 中的代码可能会做一些抛出的事情),将被“外部” block 捕获。

function a() {
    try {
        d()
        function d() {
            try {
                let user = "hello"
                let user = {name: 'bruce'}
            } catch (err) {
               console.log(err, "inside the function err")
            }
        }
    } catch (err) {
         console.log(err, "Error caught")
    }
}

a()

错误:

SyntaxError: Identifier 'user' has already been declared, 'Error caught'

考虑到上面的语句错误应该在内部 catch block 中捕获,那么为什么它会在外部 catch block 中捕获 我预计错误应该在“内部捕获 block ”(即 err,“在函数 err 内部”)内被捕获,但它被“外部” block 捕获(即,err,“Error Caught”)。

最佳答案

在您的代码段中,当您声明 let user 时,let 允许您声明仅限于 block 语句或使用它的表达式的范围的变量,这与 var 关键字不同,无论 block 作用域如何,它都为整个函数全局或局部定义了一个变量。



当你保持相同的变量名时,程序编译时会被认为是一个错误,而 try catch 会在 run-time 检测到错误。因此,您的程序没有得到完全编译,并且由于 duplicate variable name 而在编译时给出错误。


希望你明白了。


而是尝试下面的代码。

function a() {
    try {
        d()
        function d(user) {
           try {
               JSON.parse(user);
               } catch (err) {
                 console.log(err, "inside the function err")
                 }
                }
    } catch (err) {
        console.log(err, "Error caught")
    }
}

a()

它将为您提供预期的输出。

关于Javascript 嵌套异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57830997/

相关文章:

javascript - 使图像黑白 Javascript

java - 如何处理 Observer 中的数据输出?

java - 使用 StringTokenizer 评估用户输入,同时利用自定义检查异常

python - 为什么在运行此脚本时获取无效的文字?

python - 在python中的函数调用外部重印错误

bash - Bash 在执行脚本时忽略错误的理由是什么?

javascript - 如何查看浏览器的cookies是启用还是禁用?

javascript - 使用 $scope.$emit 和 $scope.$on

javascript - 使用 `which` 属性以编程方式触发 keydown 事件

python - 需要处理keyerror异常python