www.weide1946.com:PHP相当管理浅析

2019-08-03 14:26 来源:未知

BadMethodCallException是PHP标准库里的异常处理类,是PHP自带的,比如在很多框架中可以看见继承BadMethodCallException类,如Yii2中:

PHP异常处理浅析

   这篇文章主要介绍了PHP异常处理浅析,本文着重讲解如何捕获异常,并给出代码操作实例,需要的朋友可以参考下

  PHP预定了两个异常类:Exception和ErrorException

   代码如下:

  Exception {

  /* 属性 */

  protected string $message ; //异常消息内容

  protected int $code ; //异常代码号

  protected string $file ; //抛出异常的文件名

  protected int $line ; //抛出异常在该文件中的行号

  /* 方法 */

  public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = null]]] )

  final public string getMessage ( void ) //异常抛出的信息

  final public Exception getPrevious ( void ) //前一异常

  final public int getCode ( void ) //异常代码,这是用户自定义的

  final public string getFile ( void ) //发生异常的文件路劲

  final public int getLine ( void ) //发生异常的行

  final public array getTrace ( void ) //异常追踪信息(array)

  final public string getTraceAsString ( void ) //异常追踪信息(string)

  public string __toString ( void ) //试图直接 将异常对象当作字符串使用时调用子函数的返回值

  final private void __clone ( void ) //克隆异常对象时调用

  }

   代码如下:

  ErrorException extends Exception {

  /* 属性 */

  protected int $severity ;

  /* 方法 */

  public __construct ([ string $message = "" [, int $code = 0 [, int $severity = 1 [, string $filename = __FILE__ [, int $lineno = __LINE__ [, Exception $previous = NULL ]]]]]] )

  final public int getSeverity ( void )

  /* 继承的方法 */

  final public string Exception::getMessage ( void )

  final public Exception Exception::getPrevious ( void )

  final public int Exception::getCode ( void )

  final public string Exception::getFile ( void )

  final public int Exception::getLine ( void )

  final public array Exception::getTrace ( void )

  final public string Exception::getTraceAsString ( void )

  public string Exception::__toString ( void )

  final private void Exception::__clone ( void )

  }

  那么如何捕获异常?

  (1)PHP可用try...catch...捕获异常,进行异常处理的代码必须在try代码块内。

   代码如下:

  try {

  throw new Exception('exception test 1', 1001);

  } catch(Exception $e) {

  echo $e->getMessage().'-'.$e->getCode();

  }

  (2)用户可以自定义异常处理函数[set_exception_handler],用于没用用try/catch捕获的异常。

   代码如下:

  function exception_handler ( $e ) {

  echo "Uncaught exception: " , $e -> getMessage (), "n" ;

  }

  set_exception_handler ( 'exception_handler' );

  throw new Exception ( 'Uncaught Exception' );

  echo "这行不会执行了";

  可以看到使用ser_exception_handler回调函数处理异常,后续的代码不会继续执行,但try-catch可以。

  (3)PHP可用多catch捕获不同类型异常,并允许在catch代码块内再次抛出异常。

  代码如下:

  //请根据实际扩展异常类

  class MyException extends Exception {

  public function __construct($message = '', $code = 0) {

  }

  public function myFunction() {

  echo 'just for test';

  }

  }

  try {

  throw new MyException('an error');

  } catch (MyException $e) {

  echo $e->myFunction();

  } catch (Exception $e) {

  echo $e->getMessage();

  }

  (4)PHP5.5已经支持finally关键词,你无需关心异常是否溢出了。

www.weide1946.com 1

  可对比如下:

   代码如下:

  function doSomething() {

  $resource = createResource();

  try {

  $result = useResource($resource);

  } catch (Exception $e) {

  releaseResource($resource);

  log($e->getMessage());

  exit();

  }

  releaseResource($resource);

  return $result;

  }

  //使用finally后

  function doSomething2() {

  $resource = createResource();

  try {

  $result = useResource($resource);

  return $result;

  } catch (Exception $e) {

  log($e->getMessage());

  exit();

  } finally {

  releaseResource($resource);

  }

  }

这篇文章主要介绍了PHP异常处理浅析,本文着重讲解如何捕获异常,并给出代码操作实例,需要的朋友可以参考下 PHP预定了两...

PHP预定了两个异常类:Exception和ErrorException

namespace yiibase;
 
/**
 * InvalidCallException represents an exception caused by calling a method in a wrong way.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
class InvalidCallException extends BadMethodCallException
{
    /**
     * @return string the user-friendly name of this exception
     */
    public function getName()
    {
        return 'Invalid Call';
    }
}

复制代码 代码如下:

BadMethodCallException类又是继承BadFunctionCallException的:

Exception {
    /* 属性 */
    protected string $message ; //异常消息内容
    protected int $code ; //异常代码号
    protected string $file ; //抛出异常的文件名
    protected int $line ; //抛出异常在该文件中的行号
    /* 方法 */
    public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = null]]] )
    final public string getMessage ( void ) //异常抛出的信息
    final public Exception getPrevious ( void ) //前一异常
    final public int getCode ( void ) //异常代码,这是用户自定义的
    final public string getFile ( void ) //发生异常的文件路劲
    final public int getLine ( void ) //发生异常的行
    final public array getTrace ( void ) //异常追踪信息(array)
    final public string getTraceAsString ( void ) //异常追踪信息(string)
    public string __toString ( void ) //试图直接 将异常对象当作字符串使用时调用子函数的返回值
    final private void __clone ( void ) //克隆异常对象时调用
}

 BadMethodCallException extends BadFunctionCallException {
/* 继承的属性 */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* 继承的方法 */
final public string Exception::getMessage ( void )
final public Exception Exception::getPrevious ( void )
final public int Exception::getCode ( void )
final public string Exception::getFile ( void )
final public int Exception::getLine ( void )
final public array Exception::getTrace ( void )
final public string Exception::getTraceAsString ( void )
public string Exception::__toString ( void )
final private void Exception::__clone ( void )
}

复制代码 代码如下:

用法,在控制中:

ErrorException  extends Exception  {
 
    /* 属性 */
    protected int $severity   ;
    /* 方法 */
   
    public __construct  ([ string $message  = ""  [, int $code  = 0  [, int $severity  = 1  [, string $filename  = __FILE__  [, int $lineno  = __LINE__  [, Exception  $previous  = NULL    ]]]]]] )
    final public int getSeverity  ( void )
    /* 继承的方法 */
    final public string Exception::getMessage  ( void )
    final public Exception Exception::getPrevious  ( void )
    final public int Exception::getCode  ( void )
    final public string Exception::getFile  ( void )
    final public int Exception::getLine  ( void )
    final public array Exception::getTrace  ( void )
    final public string Exception::getTraceAsString  ( void )
    public string Exception::__toString  ( void )
    final private void Exception::__clone  ( void )
}

public function actionResetPassword($token)
{
    try {
        $model = new ResetPasswordForm($token);
    } catch (InvalidParamException $e) {
        throw new BadRequestHttpException($e->getMessage());
    }
 
    if ($model->load(Yii::$app->request->post()) && $model->validate() && $model->resetPassword()) {
        Yii::$app->getSession()->setFlash('success', 'New password was saved.');
 
        return $this->goHome();
    }
 
    return $this->render('resetPassword', [
        'model' => $model,
    ]);
}

那么如何捕获异常?

用于捕获异常。

(1)PHP可用try...catch...捕获异常,进行异常处理的代码必须在try代码块内。

当然除了上面介绍的还异常处理类Exception

复制代码 代码如下:

1、首先php5提供了基本的异常处理类,可直接使用
 
<?php
class Exception
{
protected $message = 'Unknown exception'; // 异常信息
protected $code = 0; // 用户自定义异常代码
protected $file; // 发生异常的文件名
protected $line; // 发生异常的代码行号
function __construct($message = null, $code = 0);
final function getMessage(); // 返回异常信息
final function getCode(); // 返回异常代码
final function getFile(); // 返回发生异常的文件名
final function getLine(); // 返回发生异常的代码行号
final function getTrace(); // backtrace() 数组
final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
/* 可重载的方法 */
function __toString(); // 可输出的字符串
}
?>

try {
    throw new Exception('exception test 1', 1001);
} catch(Exception $e) {
    echo $e->getMessage().'-'.$e->getCode();
}

简单的使用如下:(通过异常,抛出错误信息)
 
try {
$error = 'my error!';
throw new Exception($error)
} catch (Exception $e) {
echo $e->getMessage();
}

(2)用户可以自定义异常处理函数[set_exception_handler],用于没用用try/catch捕获的异常。

2、我们可以扩展此类,方便我们的使用
 
class MyException extends Exception
{
// 重定义构造器使 message 变为必须被指定的属性
public function __construct($message, $code = 0) {
// 自定义的代码
// 确保所有变量都被正确赋值
parent::__construct($message, $code);
}
// 自定义字符串输出的样式
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}n";
}
public function customFunction() {
echo "A Custom function for this type of exceptionn";
}
}

复制代码 代码如下:

异常处理的基本思想是代码在try代码被调用执行。如果try码块出现错误,我们可以执行一个抛出异常的处理。某些编程语言,如java,,在特定情况下将自动抛出异常。在php中,异常必须手动抛出。可以使用如下方式抛出一个异常:
  Throw new Exception(‘message',code);
  Throw 关键字将触发异常处理机制,它是一个语言结构,而不是一个函数,但是必须给它传递一个值。它要求一个接受对象。在最简单的情况下,可以实例化一个内置的Exception类。
  最后,在try代码之后,必须至少给出一个catch代码块。可以将多个catch代码块与一个try代码块进行关联。如果每个catch代码块可以捕获一个不同类型的异常,可以使用多个catch代码块是有意义的。例如,如果想捕获Exception类的异常,代码如下
 
Catch(Exception $e)
{
//handing exception
}
Catch代码捕获的对象就是导致异常并传递给throw语句的对象(被throw 语句抛出)。使用Exception 类的实例,是不错的选择。
Exception类提供了如下的内置方法:
  Getcode()   —返回传递给构造函数的代码。
  GetMessage() —返回传递给构造函数的消息。
  getFile()     —返回产生异常代码的文件的路径
  getLine()    —返回产生异常的代码所在的行。

function  exception_handler ( $e ) {
    echo  "Uncaught exception: "  ,  $e -> getMessage (),  "n" ;
}
 
set_exception_handler ( 'exception_handler' );
 
throw new  Exception ( 'Uncaught Exception' );
 
echo "这行不会执行了";

注意:
当捕获到一个异常后,try()块里面的后续代码将不会继续执行,而是会尝试查找匹配的“catch”代码块
当抛出一个异常后,如果不进行catch处理,则会报“Uncaught exception 'Exception'”错误
 
<?php
function test($val){
if ($val>100){
throw new Exception("提示信息:您输入的值过大");
}
}
test(111);
?>

可以看到使用ser_exception_handler回调函数处理异常,后续的代码不会继续执行,但try-catch可以。
(3)PHP可用多catch捕获不同类型异常,并允许在catch代码块内再次抛出异常。

3.当一个异常抛出后,catch语句块可以进行处理也可以不处理
以下是我用户注册功能的部分代码
 
try{
//check forms filled in
if(!filled_out($_POST)){
throw new Exception('你还没有填写表单,请回去填写');
}
//check email address not valid
if(!check_email($email)){
throw new Exception('邮件的格式不正确');
}
//检查密度的长度是否大于6
if(strlen($passwd<6)){
throw new Exception('密度的长度应该大于6');
}
//检查两次密码是否相等
if($passwd!=$passwd1){
throw new Exception('两次密码不一样,请重新输入');
}
//检查用户名的长度是否正确
if(strlen($username)>16){
throw new Exception('用户名的长度不符,请重新输入');
}
} catch(Exception $e){
echo $e->getMessage(); //输出异常信息。
}

复制代码 代码如下:

//请根据实际扩展异常类
class MyException extends Exception {
    public function __construct($message = '', $code = 0) {
 
    }
 
    public function myFunction() {
        echo 'just for test';
    }
}
 
try {
    throw new MyException('an error');
} catch (MyException $e) {
    echo $e->myFunction();
} catch (Exception $e) {
    echo $e->getMessage();
}

(4)PHP5.5已经支持finally关键词,你无需关心异常是否溢出了。

www.weide1946.com 2

可对比如下:

复制代码 代码如下:

function doSomething() {
    $resource = createResource();
    try {
        $result = useResource($resource);
    } catch (Exception $e) {
        releaseResource($resource);
        log($e->getMessage());
        exit();
    }
    releaseResource($resource);
    return $result;
}
 
//使用finally后
function doSomething2() {
    $resource = createResource();
    try {
        $result = useResource($resource);
        return $result;
    } catch (Exception $e) {
        log($e->getMessage());
        exit();
    } finally {
        releaseResource($resource);
    }
}

您可能感兴趣的文章:

  • php中异常处理方法小结
  • php异常处理使用示例
  • php异常处理技术,顶级异常处理器
  • php错误、异常处理机制(补充)
  • PHP如何抛出异常处理错误
  • php 异常处理实现代码
  • php5编程中的异常处理详细方法介绍
  • php异常处理方法实例汇总
版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于网络编程,转载请注明出处:www.weide1946.com:PHP相当管理浅析