Как передать исключение, пойманное во внутреннем улове, к внешнему улову во вложенном try catch

Я вставляю try catch внутри основного try catch statement, что я хотел бы знать, так это то, как я могу сделать основной попытку catch fail, если один из вложенных попыток catch не работает?

Вот мой код:

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

Ответ 1

После error_log(); в первом try-catch введите throw $e; (в новой строке). Это снова вызовет ошибку, и внешний try-catch обработает ее.

Ответ 2

Вы должны расширить исключение для различных типов исключений. Таким образом вы можете запустить специальный блок try-catch:

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

Кроме того, вы можете связать свои операторы catch, чтобы запускать разные блоки в одном try-catch:

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

Ответ 3

Внутри внутреннего 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();
}

Ответ 4

использование переменной bool и ключевое слово "return" в соответствующем месте могло бы сделать трюк для вас...

Ответ 5

Я обрабатываю исключения так же, как eventHandling в Javascript. Событие пузырится вверх по лестнице от конкретного к родовому. Когда он достигает стартовой программы, исключение потеряло все, что это значит для кода, и должно просто быть пойманным для регистрации и завершения приложения.

В то же время может случиться много вещей

CallStack:

  • Начать обед
  • Ешьте яблоко (перед этим кодом яблоко было куплено как обед)
  • Раковина в яблоне

Во время еды яблока появился червь:

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

Ешьте область видимости 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;
    }
}