如何将函数内的catch错误传递给parent

Har*_*wan 4 javascript try-catch

我有几行代码的样本,想知道下面的逻辑是怎样的:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Edd*_*e D 10

你只是再次抛出相同的错误.捕获允许您处理它,您想要记录它,或防止它等等.或者您可以重新抛出它.当你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;
  }
}
Run Code Online (Sandbox Code Playgroud)

一种在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.');
  }
}
Run Code Online (Sandbox Code Playgroud)