1、php.ini中配置错误消息
1-1、在php.ini中error_reporting控制输出到用户端的消息种类
error_reporting = E_ALL;//设置向php报告发生的错误类型
display_errors = Off; //设置错误是否显示在客户端
log_errors = On; //开启日志记录
error_log = "d://wamp/logs/php_error.log";//错误日志记录文件
1-2、配置值
http://php.net/manual/zh/errorfunc.constants.php
除了在php.ini文件中可以调整错误消息的显示级别外,在php代码中也可以自定义消息显示的级别。
使用error_reporting()函数。
error_reporting(E_ALL & ~E_NOTICE);//显示除了E_NOTICE之外的所有错误信息。
<=>error_reporting(E_ALL ^ E_NOTICE);
开发过程中建议全部开启即 error_reporting(E_ALL);
线上过程中全部关闭即 error_reporting(0);
1-3、默认处理
在php中,对于错误处理非常的宽松。php系统会尽量让程序运行下去,除非遇到致命错误。
直接打印一个未赋值变量$t时候,系统报出一个Notice,未定义变量。
做除以0的运算时,系统报出一个Warning,提示有除以0这样的警告,程序依然在运行。
当实例化一个不存在的类的时候,发生致命错误,程序终止运行。
1-4、自定义处理
set_error_handler('error_handler')函数向系统声明错误处理函数。
使用trigger_error()函数,可以触发一个 error。
例如trigger_error("你输入的年龄必须大于0",E_USER_ERROR),触发自己的错误信息。
2、异常捕获和处理
2-1、php中的异常捕获和处理
扩展php内置的异常处理类;可以通过实例化 Exception 类或者它的子类来创建一个异常实例。
http://php.net/manual/zh/class.exception.php
异常处理功能提供了处理程序运行时出现的错误或异常情况的方法。
php5提供了一种新的面向对象的错误处理方法。使用检测(try)、抛出(throw)和捕获(catch)异常。
Try-使用异常的函数应该位于"try"代码块内。如果没有触发异常,则代码将照常继续执行。但是如果
异常被触发,会抛出一个异常。
Throw-这里规定如何触发异常。每一个"throw"必须对应至少一个"catch"。
Catch-"catch"代码块会捕获异常,并创建一个包含异常信息的对象。
一个try至少要有一个与之对应的catch。定义多个catch可以捕获不同的对象。php会按这些catch被定
义的顺序执行,直到完成最后一个为止。而在这些try内,又可以抛出新的异常。try中嵌套try..catch。
2-2、自定义异常
注意事项:
自定义的异常必须继承自Exception类或它的子类。
自定义的异常要重新定义构造函数的话,建议同时调用parent::__construct($msg,$code)来检测所有的变量是否已被
赋值。
当对象要输出字符串的时候,可以重载__toString()并自定义输出的样式。
设置顶层异常处理器:
set_exception_handler()函数可设置处理所有未捕获异常的用户定义函数。
set_exception_handler('exFun');
function exFun(Exception $e){
echo $e->getMessage();
}
1-1、在php.ini中error_reporting控制输出到用户端的消息种类
error_reporting = E_ALL;//设置向php报告发生的错误类型
display_errors = Off; //设置错误是否显示在客户端
log_errors = On; //开启日志记录
error_log = "d://wamp/logs/php_error.log";//错误日志记录文件
1-2、配置值
http://php.net/manual/zh/errorfunc.constants.php
除了在php.ini文件中可以调整错误消息的显示级别外,在php代码中也可以自定义消息显示的级别。
使用error_reporting()函数。
error_reporting(E_ALL & ~E_NOTICE);//显示除了E_NOTICE之外的所有错误信息。
<=>error_reporting(E_ALL ^ E_NOTICE);
开发过程中建议全部开启即 error_reporting(E_ALL);
线上过程中全部关闭即 error_reporting(0);
1-3、默认处理
在php中,对于错误处理非常的宽松。php系统会尽量让程序运行下去,除非遇到致命错误。
直接打印一个未赋值变量$t时候,系统报出一个Notice,未定义变量。
做除以0的运算时,系统报出一个Warning,提示有除以0这样的警告,程序依然在运行。
当实例化一个不存在的类的时候,发生致命错误,程序终止运行。
1-4、自定义处理
function error_handler($errno,$errmsg,$errfile,$errline){
switch($errno){
case E_USER_ERROR:
echo '自定义错误处理类型:['.$errno.'],错误消息:'.$errmsg.'<br />';
echo '产生的错误的文件:'.$errfile.',所在行是:'.$errline.'<br />';
break;
case E_WARNING:
echo '自定义的警告:['.$errno.'],错误消息:'.$errmsg.'<br />';
echo '产生的错误的文件:'.$errfile.',所在行是:'.$errline.'<br />';
break;
case E_NOTICE:
echo '自定义的NOTICE:['.$errno.'],错误消息:'.$errmsg.'<br />';
echo '产生的错误的文件:'.$errfile.',所在行是:'.$errline.'<br />';
break;
default:
echo '自定义的警告:['.$errno.'],错误消息:'.$errmsg.'<br />';
echo '产生的错误的文件:'.$errfile.',所在行是:'.$errline.'<br />';
break;
}
}
set_error_handler('error_handler')函数向系统声明错误处理函数。
使用trigger_error()函数,可以触发一个 error。
例如trigger_error("你输入的年龄必须大于0",E_USER_ERROR),触发自己的错误信息。
2、异常捕获和处理
2-1、php中的异常捕获和处理
扩展php内置的异常处理类;可以通过实例化 Exception 类或者它的子类来创建一个异常实例。
http://php.net/manual/zh/class.exception.php
异常处理功能提供了处理程序运行时出现的错误或异常情况的方法。
php5提供了一种新的面向对象的错误处理方法。使用检测(try)、抛出(throw)和捕获(catch)异常。
Try-使用异常的函数应该位于"try"代码块内。如果没有触发异常,则代码将照常继续执行。但是如果
异常被触发,会抛出一个异常。
Throw-这里规定如何触发异常。每一个"throw"必须对应至少一个"catch"。
Catch-"catch"代码块会捕获异常,并创建一个包含异常信息的对象。
一个try至少要有一个与之对应的catch。定义多个catch可以捕获不同的对象。php会按这些catch被定
义的顺序执行,直到完成最后一个为止。而在这些try内,又可以抛出新的异常。try中嵌套try..catch。
2-2、自定义异常
注意事项:
自定义的异常必须继承自Exception类或它的子类。
自定义的异常要重新定义构造函数的话,建议同时调用parent::__construct($msg,$code)来检测所有的变量是否已被
赋值。
当对象要输出字符串的时候,可以重载__toString()并自定义输出的样式。
设置顶层异常处理器:
set_exception_handler()函数可设置处理所有未捕获异常的用户定义函数。
set_exception_handler('exFun');
function exFun(Exception $e){
echo $e->getMessage();
}
3、异常处理实例
实例功能:
php实现用户登录并对用户名和密码长度进行验证。
验证规则:用户名和密码长度必须在3-8位之间。
index.php
<?php
session_start();
$validata_username = isset($_SESSION['validata_username'])?$_SESSION['validata_username']:'';
$validata_password = isset($_SESSION['validata_password'])?$_SESSION['validata_password']:'';
?>
<html>
<head>
<meta charset="utf-8"/>
<title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
<form action="login.php" method="post">
用户名:<input type="text" name="username" value=""/> <font color="red"><?php echo $validata_username; ?></font>
<br /><br />
密 码:<input type="text" name="password" value=""/> <font color="red"><?php echo $validata_password; ?></font>
<br /><br />
<input type="submit" value="提交"/>
</form>
</body>
</html>
login.php
<?php
session_start();
//print_r($_POST);
$username = $_POST['username'];
$password = $_POST['password'];
//echo $username,'=>',$password;
$user = new User($username,$password);
//判断是否登录成功
try{
Validata::validataUser($user);
//验证通过,登录成功
$_SESSION['username'] = $username;
header('Location:main.php');
} catch(MyException $me){
header('Location:index.php');
}
//自动加载类的函数
function __autoload($class)
{
$file = __DIR__.'/'.strtolower($class).'.php';
if(is_file($file)){
include_once $file;
}
return '';
}
user.php
<?php
class User{
private $username;
private $password;
function __construct($username,$password) {
$this->username = $username;
$this->password = $password;
}
function getUsername(){
return $this->username;
}
function getPassword(){
return $this->password;
}
}
validata.php
<?php
class Validata{
static function validataUser(User $user){
//print_r($user);
$username = $user->getUsername();
$password = $user->getPassword();
//每次都要清空SESSION变量值
unset($_SESSION['validata_username'],$_SESSION['validata_password']);
//验证用户名
try{
self::validataUsername($username);
} catch(MyException $me){
$_SESSION['validata_username'] = $me->getMessage();
}
//验证密码
try{
self::validataPassword($password);
} catch(MyException $me){
$_SESSION['validata_password'] = $me->getMessage();
}
if(isset($me)){//对象存在时要抛出!
throw $me;
}
}
//验证用户名
static private function validataUsername($username){
$len = strlen($username);
if($len < 3){
//echo '用户名不能小于3位';
//不能直接输出错误信息,而是抛出异常
throw new MyException('用户名长度不能小于3位',E_USER_ERROR);
}
if($len > 8){
throw new MyException('用户名长度不能大于8位',E_USER_ERROR);
}
}
//验证密码
static private function validataPassword($password){
$len = strlen($password);
if($len < 3){
//echo '用户名不能小于3位';
//不能直接输出错误信息,而是抛出异常
throw new MyException('密码长度不能小于3位',E_USER_ERROR);
}
if($len > 8){
throw new MyException('密码长度不能大于8位',E_USER_ERROR);
}
}
}
MyException.php
<?php
class MyException extends Exception{
}
main.php
<?php
session_start();
echo '登录成功,登录用户为:'.$_SESSION['username'],'<br /><br />';
echo '<a href="index.php">重新登录</a>';