Как передать исключение, пойманное во внутреннем catch, во внешний catch во вложенном catch catch - PullRequest
10 голосов
/ 23 июня 2011

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

Вот мой код:

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

Ответы [ 5 ]

18 голосов
/ 23 июня 2011

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

5 голосов
/ 23 июня 2011

Вы должны расширить Исключение для различных типов Исключений.Таким образом, вы можете запустить конкретный блок 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
}
2 голосов
/ 23 июня 2011

Внутри внутреннего 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();
}
1 голос
/ 12 декабря 2014

Я обрабатываю исключения способом, подобным 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;
    }
}
0 голосов
/ 23 июня 2011

Использование переменной bool и ключевого слова return в соответствующем месте может помочь вам ...

...