2010-01-25 116 views

回答

63

当然,正好赶上要继续执行异常...

try 
    { 
     SomeOperation(); 
    } 
    catch (SomeException $e) 
    { 
     // do nothing... php will ignore and continue  
    } 

当然,这有默默下降,这可能是一个非常重要的错误的问题。 SomeOperation()可能会失败,导致其他细微的难以解决的问题,但是你永远不会知道你是否默默地放弃了异常。

+0

嘎!击败我21秒。 – 2010-01-25 14:12:05

+4

如果我可能会添加:在catch块中没有做任何事情的情况下捕获一个异常被认为是不好的风格,那么你至少应该写一些日志输出(或者,如在示例中,提供一个评论,确实,真的,真的没有必要完成)。如果您捕获_any_异常并且catch(Exception $ ex){} – dbemerlin 2010-01-25 14:13:25

+1

,那么尤其如此,那么如何记录它并仍然继续? – numerical25 2013-02-11 14:18:14

13

肯定的:

try { 
    throw new Exception('Something bad'); 
} catch (Exception $e) { 
    // Do nothing 
} 

你可能想去有PHP文档的读取上Exceptions

+3

+1为建议阅读手册。 – GZipp 2010-01-25 14:42:34

+0

这将抛出一个新的异常现在被try块捕获,导致未捕获异常 – 2013-03-17 10:41:09

+1

@JakeN不正确。由于抛出的异常被'catch'块捕获,它可以**不会**导致未捕获的异常。 – Pere 2015-05-28 16:29:41

5

是的。

try { 
    Somecode(); 
catch (Exception $e) { 
    // handle or ignore exception here. 
} 

但是请注意,PHP也有错误代码从异常分开,遗留以前的PHP有oop原语。大多数库buildin仍然会产生错误代码,而不是例外。要忽略错误代码调用该函数带有前缀@:

@myfunction(); 
98

是的,但是这取决于你想执行什么:

例如

try { 
    a(); 
    b(); 
} 
catch(Exception $e){ 
} 

c(); 

c()将始终执行。但如果a()引发异常,b()而不是执行。

只把东西放在相互依赖的try块中。例如。 b取决于a的一些结果,在try-catch块之后放b是没有意义的。

+0

如果我有剩下的选票,我会把它放在这个... :) – 2010-01-25 15:30:28

+0

我代表你做了:) – 2015-11-05 08:02:33

+2

'$ e'需要是'\ Exception $ e'或simular或解析错误抛出 – iautomation 2016-03-01 21:29:38

0

另一个角度是从处理代码返回一个异常,而不是抛出一个异常。

我需要用我正在编写的模板框架来做到这一点。如果用户尝试访问数据中不存在的属性,则我将返回处理函数内部深处的错误,而不是抛出它。

然后,在调用代码,我可以决定是否抛出这个返回的错误,导致了尝试()赶上(),或者只是继续:

// process the template 
    try 
    { 
     // this function will pass back a value, or a TemplateExecption if invalid 
      $result = $this->process($value); 

     // if the result is an error, choose what to do with it 
      if($result instanceof TemplateExecption) 
      { 
       if(DEBUGGING == TRUE) 
       { 
        throw($result); // throw the original error 
       } 
       else 
       { 
        $result = NULL; // ignore the error 
       } 
      } 
    } 

// catch TemplateExceptions 
    catch(TemplateException $e) 
    { 
     // handle template exceptions 
    } 

// catch normal PHP Exceptions 
    catch(Exception $e) 
    { 
     // handle normal exceptions 
    } 

// if we get here, $result was valid, or ignored 
    return $result; 

这样做的结果是我仍然得到原始错误的上下文,即使它被放在最上面。

另一个选择可能是返回一个自定义的NullObject或一个UnknownProperty对象,并在决定跳过catch()之前进行比较,但是因为您可以重新抛出错误,并且如果完全控制了总体结构,我认为这是一个干净利落的问题,无法继续尝试/捕捉。

0

一个古老的问题,但我曾经从VBA scipt转到php,在那里你可以让我们“去”重新进入一个循环“On Error”与一个“简历”并离开它去了仍在处理该功能。
在php中,经过一些试验和错误之后,我现在使用嵌套try {} catch {}来处理关键和非关键的流程,甚至是相互依赖的类调用,这样我就可以追溯到错误的开始。 例如如果函数B依赖于功能,但功能c是不错的,但不应该停止的过程中,我还是想知道的所有3不顾后果,这是我做的:

//set up array to capture output of all 3 functions 
$resultArr = array(array(), array(), array()); 

// Loop through the primary array and run the functions 
foreach($x as $key => $val) 
{ 
    try 
    { 
     $resultArr[$key][0][] = a($key); 
     $resultArr[$key][1][] = b($val); 
     try 
     { // If successful, output of c() is captured 
      $resultArr[$key][2][] = c($key, $val); 
     } 
     catch(Exception $ex) 
     { // If an error, capture why c() failed 
      $resultArr[$key][2][] = $ex->getMessage(); 
     } 
    } 
    catch(Exception $ex) 
    { // If critical functions a() or b() fail, we catch the reason why 
     $criticalError = $ex->getMessage(); 
    } 
} 

现在我可以遍历每个键的结果数组并评估结果。 如果()或b()存在严重故障。
在$ resultArr发生严重故障之前,我还有一个参考点,如果异常处理程序设置正确,我知道它是否是()或b()失败。
如果c()失败,循环继续。如果c()在各个点失败了,再加上一些额外的后循环逻辑,我甚至可以通过询问$ resultArr [$ key] [2]来发现c()是否工作或每次迭代都有错误。