我有几行代码,想知道下面的逻辑是怎样的:
try {
var response = child()
console.log('why here')
} catch (err) {
console.log('should show this', err)
}
function child() {
try {
throw new Error('oops');
} catch (err) {
console.log('child error', err)
}
}
预期的结果是与err一起控制should show this
,但它返回了控制台why here
答案 0 :(得分:8)
你只是再次抛出同样的错误。捕获允许您处理它,您想要记录它,或防止它等等。或者您可以重新抛出它。
当你throw new Error()
时。您正在创建错误的新实例。投掷是使它能够做它所做的事情的原因。但你可以声明错误而不抛弃错误。
let e = new Error('my error :D');
//Do some stuff......
throw e;
如果你扔掉它并且它被抓住了,e仍然是一个错误的实例。您可以一次又一次地抛出它直到应用程序崩溃:D
但它是记录堆栈跟踪,局部变量等详细信息的好方法。 大多数专业团队都有自己的自定义控制台记录器,可以将控制台日志保存到数据库中并在以后查看。此日志记录事件可能在每次尝试捕获时发生,并向日志添加次要详细信息,这有助于调试大型复杂项目。此外,在很多强类型语言中,您可以有多个捕获,允许根据错误类型(ReferenceError,TypeError等)进行不同的响应。因此,您可以捕获一个错误,分析它发生的原因并可能抛出您自己的自定义错误,以便更高的进程处理它:o
try
{
var response = child()
console.log('why here')
}
catch (err)
{
console.log('should show this', err)
}
function child()
{
try
{
throw new Error('oops');
}
catch (err)
{
console.log('child error', err)
throw err;
}
}

在Javascript中按类型处理错误
有更好的方法可以做到这一点,但这只是一个例子。想象一下,如果我们有一个为每个开关案例而不仅仅是一个控制台日志启动的功能。根据错误类型,启动差异响应。与此相关的问题是,如果在Error类中有多个继承层。
function ValidateClassType(obj, classDef)
{
if(!obj || !classDef)
{
throw new ReferenceError("1 or More Parameters is Undefined");
}
if(typeof classDef != 'function')
{
throw new TypeError("classDef Must be a Callable Constructor.")
}
let isInstanceOf = obj instanceof classDef;
if(!isInstanceOf)
{
throw new TypeError("Invalid Class Type for Operation");
}
}
try
{
ValidateClassType(1, null);
}
catch(err)
{
let errType = err.constructor.name;
switch(errType)
{
case 'ReferenceError':
console.log('A Reference Error Occured.');
break;
case 'TypeError':
console.log('A type Error Occured.');
break;
default:
console.log('An Unhandled Error Occurred.');
}
}