我有几行示例代码,想知道下面的逻辑到底如何:

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

最佳答案

您只是再次抛出相同的错误。捕获可以让您处理它,想要对其进行记录或阻止它等等。或者您可以将其重新扔掉。
当您throw new Error()时。您正在创建一个错误的新实例。抛出是使它能够执行其操作的原因。但是您可以声明错误而不抛出错误。
let e = new Error('my error :D');//Do some stuff......throw e;
如果抛出e并被捕获,则e仍然是错误的一个实例。您可以一次又一次地抛出它,直到应用程序崩溃:D

但这是记录有关堆栈跟踪,局部变量等的详细信息的好方法。
大多数专业团队将拥有自己的自定义控制台记录器,该控制台记录器可将控制台日志保存到数据库中,并在以后进行检查。此日志记录事件可能会在每次 try catch 时发生,并将次要详细信息添加到日志中,这将有助于调试庞大而复杂的项目。此外,在许多强类型语言中,您可以具有多个捕获,这些捕获根据错误类型(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;
  }
}


通过Java脚本按类型处理错误

有更好的方法可以做到这一点,但这只是一个例子。试想一下,如果我们有一个针对每种开关情况触发的功能,而不仅仅是控制台日志。根据错误的类型,将启动差异响应。如果您在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.');
  }
}

关于javascript - 如何将函数内部的catch错误传递给父级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50705308/

10-12 00:17
查看更多