什么时候应该在JavaScript中使用try/catch?

什么时候应该在JavaScript中使用try/catch?,javascript,try-catch,Javascript,Try Catch,当我使用JavaScript开发普通的web应用程序时,通常不需要try/catch语句。JavaScript中没有文件、IO或数据库连接 try/catch语句在JavaScript中有用吗?什么时候可以使用它?只要运行的代码可能引发异常,就使用它。请记住,您可以抛出您自己的错误-我使用的大多数try…catch东西都是用于捕获我自己的异常。try…catch块通常被鼓励少用,这不取决于您使用的语言 主要原因是catch块的成本。另一个原因是,当您使用单个try…catch块包装许多语句时,在

当我使用JavaScript开发普通的web应用程序时,通常不需要
try/catch
语句。JavaScript中没有文件、IO或数据库连接


try/catch
语句在JavaScript中有用吗?什么时候可以使用它?

只要运行的代码可能引发异常,就使用它。请记住,您可以抛出您自己的错误-我使用的大多数
try…catch
东西都是用于捕获我自己的异常。

try…catch
块通常被鼓励少用,这不取决于您使用的语言

主要原因是
catch
块的成本。另一个原因是,当您使用单个
try…catch
块包装许多语句时,在
catch
块中,您无法确定主要问题到底是什么

最好使用输入验证或
if…else
块之类的技术来降低发生异常(错误)的概率。例如,当您希望使用从用户处获取的数字时,您可以使用以下命令,而不是使用
try…catch

if (isNaN(numberVariable))
{
    alert('you should enter a valid number');
}

外部Javascript库和小部件通常利用异常来处理实例化错误。通常需要:

try {
  var w = new Widget();
}
catch (e) {
  // widget failed
}
嗯,我个人(mis?)使用它,当我写一些我不确定是否能正确执行的代码时,但用户不需要知道错误

除此之外,我一直在一些用户控件上使用它,您可以在HTML标记中为其定义“action”属性,javascript将尝试执行该操作,如下所示:

try{
     window['method'](args);
}catch(e){
     try{
         window['optionalExceptionHandler'](e, args);
     }catch(e){ return; }
}

(我喜欢认为它比
eval()
xD)好)

我发现try/catch/finally有一个场景非常有用,它可以在任何级别上使用空值弹出的深度嵌套对象。例如,考虑这一点:

var something = one.two.three.four.five;
要以100%的安全性执行此“获取”,必须编写一些详细的代码:

if(one && one.two && one.two.three && one.two.three.four)
   something = one.two.three.four.five;
现在假设变量名是真实的和更长的,您很快就会得到一个非常难看的代码if语句

我倾向于使用try/catch/finally来简化这一点,因为我不关心任何“其他”场景,只想要或不想要对象:

var something;
try { something = one.two.three.four.five; }
catch { something = "default"; }
finally { doSomething(something); }
我从一个

什么时候应该使用try-catch?

try-catch语句应该在任何时候向用户隐藏错误,或者在任何时候为了用户的利益而产生自定义错误时使用。如果您还没有弄明白,当您执行try-catch语句时,浏览器通常的错误处理机制将被禁用

在构建大型应用程序时,您可能会看到这可能带来的好处。调试任何应用程序流中的每一种可能情况通常都很耗时,许多可能性可能会被无意中忽略。当然,通过适当的bug测试,不应该忽略任何方面。但是try-catch语句在代码中的某些区域起到了很好的回退作用,这些区域在开发过程中无法预见的异常情况下可能会失败

try-catch语句提供的另一个好处是,它向无论如何都无法理解的用户隐藏了过度技术性的错误消息

使用try-catch的最佳时机是在代码的某些部分,无论出于何种原因,您都会怀疑会发生超出您控制范围的错误

什么时候应该避免试捕?


如果您知道将要发生错误,就不应该使用try-catch语句,因为在这种情况下,您希望调试问题,而不是屏蔽它。try-catch语句应仅在怀疑可能发生错误的代码段上执行,并且由于可能出现的情况太多,您无法完全验证是否会发生错误,或者何时会发生错误。在后一种情况下,使用try-catch是合适的。

我不同意在JavaScript中使用try…catch是一个好方案:

var something;
try { something = one.two.three.four.five; }
catch { something = "default"; }
finally { doSomething(something); }

因为在读取对象的属性之前,记住条件对象是否存在属于JavaScript知识。你不能假装你不知道,然后写一个深奥的道具阅读链,然后围绕它进行尝试。这就像如果调用一个基本值(如函数)也会触发异常:

const val = 1
val()
你不能假装自己不知道,然后在函数的每个调用中都进行尝试。我同意在读取JavaScript中的道具时很容易忘记对象存在的条件,但这是因为JavaScript的设计错误(typescript通过可选的链接操作符解决了这个问题),总之,这不是一个好的例子来说明何时使用try…catch

要了解何时使用try…catch,需要了解何时首先抛出错误

何时抛出错误 错误是生产者在发生非常糟糕的事情时向消费者抛出的错误,使生产者不得不停止,直到消费者(在大多数情况下)做出更改。

例如,如果后端API是生产者,那么前端代码就是消费者。当前端请求后端没有的东西时,后端无法继续,所以它会向前端抛出404错误; 当前端请求未经验证而受保护的内容时,后端将抛出401错误,强制前端输入用户名和密码; 当服务器硬盘爆炸时,将抛出另一种形式的错误(如果服务器仍然可以运行)

前端代码也可以是前端代码的使用者。例如,您正在使用jQuery库、jQuery将成为生产者和前端代码将成为消费者。这是jQuery源代码中抛出错误的一个示例:

// from jQuery source code
        function( w ) {
            if ( !w.document ) {
                throw new Error( "jQuery requires a window with a document" );
            }
            return factory( w );
        };
请看,前端开发人员(消费者)在甚至文档都不存在的环境中使用jQuery,因此jQuery(生产者)真的不能继续抛出错误并停止所有操作,直到开发人员正确执行为止

如果您正在开发
// from vue-next source code

 try {
    result = postcss(plugins).process(source, postCSSOptions)
    ...
   }catch(e){}