我正在主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"关键字可以帮你。。。