【问题标题】:How to pass catch error inside function into parent如何将函数内部的catch错误传递给父级
【发布时间】:2018-06-05 16:54:12
【问题描述】:

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

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)
  }
}

预期的结果是控制台should show this和err,但它返回控制台why here

【问题讨论】:

  • 为什么不重新抛出错误?但是,我不确定冒泡错误是一种好习惯。
  • 如果此问题已解决,则标记​​为已回答。

标签: javascript try-catch


【解决方案1】:

你只是再次抛出同样的错误。 catch 允许你处理它,你想记录它,或者阻止它等等。或者你可以重新抛出它。 当你throw new Error()。您正在创建一个错误的新实例。投掷是让它能够做它所做的事情的原因。但是您可以在不抛出错误的情况下声明错误。

let e = new Error('my error :D'); //Do some stuff...... throw e;

如果你抛出 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 中按类型处理错误

有更好的方法来做到这一点,但这只是一个例子。想象一下,如果我们有一个为每个 switch case 触发的函数,而不仅仅是一个控制台日志。根据错误的类型,启动差异响应。与此相关的一个问题是,如果您在 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.');
  }
}

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多