2010-10-26 144 views
3

这是一个非常基本的问题(我希望)。我所做的大多数异常处理都是在c#中完成的。在c#中,try catch块中出错的任何代码都由catch代码处理。例如,PHP异常处理vs C#

try 
{ 
int divByZero=45/0; 
} 
catch(Exception ex) 
{ 
errorCode.text=ex.message(); 
} 

错误将显示在errorCode.text中。如果我尝试在php中运行相同的代码,但是:

try{ 
    $divByZero=45/0; 
    } 
catch(Exception ex) 
{ 
    echo ex->getMessage(); 
} 

catch代码未运行。基于我的习惯理解,php需要一个提示。这是否不符合错误检查的整个目的?这不会减少if then语句的try catch吗? 如果(除以零)抛出错误 请告诉我,我不必在抛出尝试抓住每个可能的错误。如果我这样做,是否有任何使php的错误处理行为更像c#?

+0

对不起,如果格式化是关闭,试图解决它。 – CountMurphy 2010-10-26 01:15:35

+0

零除产生一个警告,而不是一个例外 - 这解释了这一点。 – JAL 2010-10-26 01:27:01

回答

6

您也可以将您的所有PHP错误与set_error_handler()ErrorException到异常:

function exception_error_handler($errno, $errstr, $errfile, $errline) 
{ 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

try { 
    $a = 1/0; 
} catch (ErrorException $e) { 
    echo $e->getMessage(); 
} 
+0

这工作太棒了!谢谢。 – CountMurphy 2010-10-26 01:35:59

+0

这会处理所有的警告,或只是实际的错误? – CountMurphy 2010-10-26 01:37:40

+0

@CountMurphy:任何可捕捉的PHP错误,警告,通知等。 – zerkms 2010-10-26 01:40:43

1

我认为处理这个在PHP中唯一的办法就是写:

try 
{ 
    if ($b == 0) throw new Exception('Division by zero.'); 
    $divByZero = $a/$b; 
} 
catch(Exception ex) 
{ 
    echo ex->getMessage(); 
} 

不像在C#中,并非每一个问题将提高在PHP异常。有些问题会被默默地忽略(或者不是默默地 - 它们会将输出内容打印出来),但还有其他方法可以处理这些问题。我想这是因为从第一个版本开始,异常不是语言的一部分,所以有一些“遗留”机制。

+0

当它。我以前很怕那个。这似乎...可怕地gimped – CountMurphy 2010-10-26 01:21:56

2

PHP的的try-catch后来在语言的生活中实现,因此它仅适用于用户定义的异常。

如果你真的想处理实际的错误,set your own error handler

定义和捕捉异常

function oops($a) 
{ 
    if (!$a) { 
     throw new Exception('empty variable'); 
    } 
    return "oops, $a"; 
} 

try { 
    print oops($b); 
} catch (Exception $e) { 
    print "Error occurred: " . $e->getMessage(); 
}