Ответ 1
После error_log();
в первом try-catch введите throw $e;
(в новой строке). Это снова вызовет ошибку, и внешний 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();
}
После error_log();
в первом try-catch введите throw $e;
(в новой строке). Это снова вызовет ошибку, и внешний try-catch обработает ее.
Вы должны расширить исключение для различных типов исключений. Таким образом вы можете запустить специальный блок 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
}
Внутри внутреннего 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();
}
использование переменной bool и ключевое слово "return" в соответствующем месте могло бы сделать трюк для вас...
Я обрабатываю исключения так же, как 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;
}
}