如何在嵌套的try-catch中将内部catch中捕获的异常传递给外部catch


How to pass the exception caught in inner catch to outer catch in a nested try catch

我正在主try-catch语句中嵌套try-catch,我想知道的是,如果其中一个嵌套的try-catch失败,我如何使主try-cach失败?

这是我的代码:

try 
{    
    try 
    {
        //how can I make the main try catch fail if this try catch fails?
    } 
    catch(Exception $e)
    {
        error_log();
    }       
} 
catch(Exception $e)
{
    error_log();
}

在第一次try-catch中的error_log();之后,键入throw $e;(在新行上)。这将再次抛出错误,外部try-catch将处理它。

您应该为各种不同类型的Exception扩展Exception。这样你就可以触发一个特定的尝试捕获块:

try
{
  ...
  try
  {
    throwSomeException();
  }
  catch ( InnerException $e )
  {
    ...do stuff only for InnerException...
  }
  ...
}
catch ( Exception $e )
{
  ...do stuff for all types of exception...
}

此外,您可以将catch语句链接起来,在一次尝试捕获中触发不同的块:

try
{
  ...
}
catch ( SpecificTypeOfException $e )
{
  ..do something specific
}
catch ( TypeOfException $e )
{
  ..do something less specific
}
catch ( Exception $e )
{
  ..do something for all exceptions
}

在内部catch中,throw()-不推荐使用,我在执行此操作时看到了PHP的一些问题。或者在内侧接球后立旗投掷。

下面是一个抛出相同异常的例子(或者您可以抛出不同的异常)。

try {
    $ex = null;
    try {
        //how can I make the main try catch fail if this try catch fails?
    } catch(Exception $e){
        $ex = $e;
        error_log();
    }
    if ($ex) {
       throw $ex;
    }
} catch(Exception $e){
    error_log();
}

我处理异常的方式类似于Javascript中的eventHandling。一个事件在从特定到一般的阶梯上冒泡。当它到达启动程序时,一个异常失去了它对代码的所有意义,应该只捕获它来记录和结束应用程序。

与此同时,可能会发生很多事情

调用堆栈:

  • 开始午餐
  • 吃苹果(在这个代码之前,一个苹果是作为午餐买的)
  • 把牙齿陷在苹果里

在我吃苹果的过程中,出现了一条虫子:

throw NausiaException('I found a bleeding worm...');

Eat Apple示波器捕捉

catch(Exception $e)

例外的是,在这个范围内,我们可以把苹果退回商店,并对经理大喊大叫。由于没有什么比这件事更有用的了,

throw $e

因为吃苹果失败而被称为。

有些事情可能会有所不同但是,如果商店经理拒绝退款,您可以包装异常

throw new RefundFailedException('The manager is a cheap skate', RefundFailedException::REFUSED, $e)

开始午餐范围启动午餐范围想扔掉坏午餐

try {
    //Start lunch
} catch (Exception $e) {
    switch (true) {
        case $e instanceof NausiaException:
        case $e instanceof RefundFailedException:
            //Throw lunch away
            break;
    }
}

在适当的地方使用bool变量和"return"关键字可以帮你。。。