我不同意这是在 JavaScript 中使用 try...catch 的好场景:
var something;
try { something = one.two.three.four.five; }
catch { something = "default"; }
finally { doSomething(something); }
https://stackoverflow.com/a/26172702/12410906
因为在读取它的 Prop 之前记住条件对象是否存在是属于 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(生产者)真的不能继续抛出错误并停止一切,直到开发者做对了。
如果您正在开发网络应用程序,浏览您的网络应用程序的用户将是消费者,那么您的网络应用程序代码将是生产者。肯定会发生一些糟糕的事情,比如用户可能会请求一个不存在的 url(假设在 spa 应用中),或者用户可能会在手机号码输入中输入英文字母,如果你只是简单地抛出一个像 jQuery、Vue、后端这样的错误会做,用户(消费者)无法捕捉并消费它。
您真正要做的是展示一些 toast 或导航到特殊的 404 路线,让用户知道发生了什么。这就是我们大多数前端开发人员很少抛出错误的原因。
何时尝试...赶上
在了解了何时抛出错误之后,这个问题就很容易了。如果你正在消费一个可能会抛出错误的生产者,你尝试......抓住它,这是一段来自 vue-next 的源代码:
// from vue-next source code
try {
result = postcss(plugins).process(source, postCSSOptions)
...
}catch(e){}
之所以 try...catch 是因为插件 postcss 在输入不正确时会抛出错误。或者您尝试 JSON.parse 来自服务器的字符串,您尝试...捕获它。这是一般原则。