我是一个php新手,所以这可能听起来微不足道 这是我的PHP代码
<?php
try
{
echo "Hello";
}
catch (Exception $e)
{
echo $e;
}
?>
这会输出Hello
现在我修改了代码以获得异常
<?php
try
{
ech "Hello";
}
catch (Exception $e)
{
echo $e;
}
?>
但它什么都没打印。是不应该打印错误。或者我做错了什么
答案 0 :(得分:3)
您要找的是ErrorException
。
您可以像这样注册错误处理程序:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");
并发现错误:
try
{
echo $a; //Use of undefined variable
}
catch (ErrorException $e)
{
echo $e->getMessage();
}
但是你无法在php和任何其他语言中处理语法错误作为异常。当PHP脚本实际运行时,你得到致命错误的原因是解释了php。如果您尝试使用任何php编译器编译PHP脚本,则在编译时会出现语法错误。
如果您想在发生致命错误时添加一些日志记录或类似内容,可以注册 shutdown 功能(使用register_shutdown_function
):
register_shutdown_function( "MyShutDownHandler" );
function MyShutDownHandler() {
//Do something here.
}
答案 1 :(得分:2)
不,这是语法错误(或PHP术语中的解析错误)。代码永远不会在第一时间执行,因此不会抛出任何异常。
还应该注意,PHP核心函数不会抛出异常,因为PHP 5引入了异常并且它们没有删除旧的错误系统。所以现在你必须同时处理错误(核心,旧扩展)和异常(新的OO扩展,用户态代码)。您可以使用ErrorException
部分避免这种情况(请参阅链接手册页上的示例),但仍然很痛苦。
答案 2 :(得分:0)
我想在@PLB和@fab给出的好答案中再加一点。
要捕捉异常需要抛出(有道理不是吗?:P)。
我非常喜欢的一个例子是将分区处理为0。
function divide($x, $y) {
if ($y == 0) {
$up = new Exception('Cannot divide by 0');
throw $up; // :)
}
return $x/$y;
}
try {
divide(3, 0);
// more code can be added here, but is skipped if Exception is thrown.
} catch(Exception $e) {
echo $e->getMessage();
}
那么为什么这是函数中if
语句的改进?
首先,您无需在throw
和catch
之间手动跳过代码。您可以拥有自己的异常(使用一些自定义功能,也可以根据需要记录它们),并且它们会自动通过调用堆栈直到它们被捕获为止。