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

时间:2011-08-22 13:14:21

标签: javascript try-catch

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

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

7 个答案:

答案 0 :(得分:29)

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

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

最好使用输入验证或if...else块等技术来降低发生异常(错误)的可能性。例如,如果您想使用取自用户的号码,而不是使用try...catch,则可以使用:

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

答案 1 :(得分:24)

我发现try / catch / finally有用的一个场景是深度嵌套的对象,其中null可以在任何级别弹出。例如,考虑一下:

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;

现在想象一下变量名称是否真实且更长,如果声明,你很快就会得到一个非常难看的代码。

当我不关心任何“其他”场景并且只是想要对象时,我倾向于使用try / catch / finally来简化这个:

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

答案 2 :(得分:22)

我是从post here发现的:

  

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

只要您想要隐藏用户的错误,或者您希望为用户的利益生成自定义错误,就应该使用try-catch语句。如果您还没有想到它,当您执行try-catch语句时,浏览器的常用错误处理机制将被禁用。

在构建大型应用程序时,您可能会看到可能带来的好处。在任何应用程序的流程中调试每种可能的情况通常都很耗时,并且可能无意中忽略了许多可能性。当然,通过适当的错误测试,不应该忽视任何区域。但是try-catch语句在代码区域中可以作为一个很好的回退,在开发期间未预见到的异常情况下可能会失败。

try-catch语句提供的另一个好处是它隐藏了来自无法理解它们的用户的过度技术错误消息。

使用try-catch的最佳时间是您的代码的一部分,您怀疑无论出于何种原因都会发生无法控制的错误。

  

什么时候应该避免尝试捕捉?

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

答案 3 :(得分:11)

每当运行的代码可能抛出异常时使用它。请记住,您可以throw自己的错误 - 我使用的大多数try…catch内容都是为了捕捉我自己的异常。

答案 4 :(得分:4)

外部Javascript库和小部件通常使用实例化错误的异常。通常需要:

try {
  var w = new Widget();
}
catch (e) {
  // widget failed
}

答案 5 :(得分:1)

好吧,我个人(错误?)使用它,当我编写一些我不确定会正确执行的代码,但用户不需要知道错误。

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

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

(我觉得它比eval() xD更好

答案 6 :(得分:1)

我不同意这是在JavaScript中使用try ... catch的好方案:

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

https://stackoverflow.com/a/26172702/12410906

因为在阅读对象的属性之前记住先确定对象是否存在,这属于JavaScript知识。您不能假装自己不知道它,而只是写一个很深的道具阅读链并在其中包裹一下try ... catch。就像您调用一个函数的原始值一样,它也会触发异常:

const val = 1
val()

您不能假装不知道它,并在每个函数调用周围都进行try ... catch。我确实同意,在使用JavaScript读取prop时很容易忘记对象是否存在的条件,但这是因为javascript的设计错误(打字稿使用可选的链接运算符解决了此问题),用一个词不是显示何时使用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(生产者)确实不能继续抛出错误并停止一切,直到开发人员正确执行为止。

如果您正在开发Web应用程序,则浏览Web应用程序的用户将是使用者,那么您的Web应用程序代码将是生产者。如果您只是简单地抛出诸如jQuery,Vue,后端之类的错误,那么肯定会有事情发生,例如用户可能会请求一个不存在的url(在spa应用程序中假设),或者用户可能会在手机号码输入中输入英文字母。这样,用户(消费者)就无法捕获并消费它。

您真正要做的是显示敬酒或导航到特殊的404路线,以使用户知道会发生什么。这就是我们大多数前端开发人员很少抛出错误的原因。

何时尝试...赶上

这个问题在理解了何时抛出错误之后将很容易。如果您使用的是可能引发错误的生产者,请尝试...捕获它,这是来自vue-next的一段源代码:

// from vue-next source code

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

尝试... catch的原因是因为当输入不正确时,插件postcss将抛出错误。或者您尝试JSON.parse从服务器的字符串,您尝试...捕获它。这是一般原则。