PHP-异常处理

摘要:
以下是异常处理方法。phpclassCode{protected$len;publicfunctionmake{$this-˃len=$len,$this->line();}publicfunctionline(){if{thrownewException;}}}}尝试{$code=newCode;$code-˃make;}捕获{echo$e-˃getMessage();}基本上,使用try/catchPHP需要手动抛出异常,这与其他语言不同。使用try…缓存触发异常。ExceptionimplementsThrowable{…}一些错误还实现了Throwable接口ErroreimplementsThrowable}例如,以下错误ArithmeticError数学运算错误DivisionByZeroError除数0错误ParseError解析代码错误,例如调用eval函数时的TypeError函数参数类型错误,函数返回值错误异常类基类方法PHP提供了用于异常处理的基本类异常。异常类的可用方法如下:方法描述重写getFile文件以生成异常错误NO,finalgetCode错误代码NO,finalfetLine错误行号NO,finargetMessage错误消息NO,final__ toString对象转换为字符串后,输出内容YES˂?

异常说明

异常是推荐的错误处理方式,传统的错误处理方式要判断并一层一层返回到调用点,如下所示:

<?php
class Code
{
    protected $len;
    public function make(int $len)
    {
        $this->len = $len;
        if ($this->line() === false) {
            return false;
        }
    }
    public function line()
    {
        if ($this->len > 5) {
            return false;
        }
    }
}
$code = new Code;
if ($code->make(10) === false) {
    echo '验证码创建失败';
}

通过上面代码我们发布处理错误时及其不方便,需要多个判断语句。下面是改用异常的处理方式。

<?php
class Code
{
    protected $len;
    public function make(int $len)
    {
        $this->len = $len;
        $this->line();
    }
    public function line()
    {
        if ($this->len > 5) {
            throw new Exception('长度不能超过五位');
        }
    }
}
try {
    $code = new Code;
    $code->make(10);
} catch (Exception $e) {
    echo $e->getMessage();
}

基本使用

try/catch

PHP需要手动抛出异常,这与其他语言不同,异常使用try...cache触发。

try{
	...
}catch(){
	...
}

try 代码块中对出现的错误可以抛出异常,下面是手动抛出异常的方法。

throw new Exception($message,$code)

catch 用于接收异常,可以设置多个catch 代码块,参数为 Exception 类或继承于 Exception 的类。

<?php
class ValidateException extends Exception
{ }
try {
    throw new ValidateException('is exception', 403);
} catch (ValidateException $e) {
    echo 'httpException' . $e->getMessage() . ';code:' . $e->getCode();
} catch (Exception $e) {
    echo $e->getMessage();
} finally {
    echo '无论是否抛出异常都将执行' . ';code:' . $e->getCode();;
}

finally

finally需要放在 catch 后,finally无论是否抛出异常都会执行。

...
} catch (Exception $e) {
    echo $e->getMessage();
} finally {
    echo '无论是否抛出异常都将执行';
}
...

Throwable

异常和部分错误实现了Throwable接口。

Exception implements Throwable {
 	...
}

部分错误也实现了 Throwable接口

Error implements Throwable {
	...
}

比如以下错误

  • ArithmeticError 数学运算错误
  • DivisionByZeroError 除数为0的错误
  • ParseError 解析代码时发生错误如调用 eval 函数时
  • TypeError 函数参数类型错误,函数返回值错误

异常类

基类方法

PHP为异常处理提供了基础类 Exception,Exception` 类可用方法如下:

方法说明重写
getFile产生异常错误的文件NO,final
getCode错误码NO,final
getLine错误行号NO,final
getMessage错误消息NO,final
__toString对象转字符串后输出内容YES
<?php
class ValidateException extends Exception
{
	//对象转字符串时执行的魔术方法
    public function __toString()
    {
        return $this->getFile();
    }
}
try {
    throw new ValidateException('is exception', 403);
} catch (ValidateException $e) {
    echo "文件:" . $e->getFile() . "<hr/>";
    echo "消息:" . $e->getMessage() . "<hr/>";
    echo "错误码:" . $e->getCode() . "<hr/>";
    echo "错误行:" . $e->getLine() . "<hr/>";
    echo $e . "<hr/>";
}

异常实例

实际开发中需要根据不同业务创建处理错误的异常类,推荐使用异常来处理错误而不是PHP的错误处理机制。

因为代码量比较大,大家请查看视频教程来学习。

自定义异常

下面是通过实例讲解自定义异常的使用方法。

目录结构

app
-- Exceptions
	-- ValidateException.php
	-- ViewException.php
-- Servers
	-- Validate.php
	-- View.php
-- vendor
-- view
	-- error.blade.php
	-- index.blade.php
	-- success.blade.php
bootstrap.php
composer.json
controller.php
index.php

文件内容

appExceptionsValidateException.php

<?php
namespace AppExceptions;

class ValidateException extends Exception
{
    public function render()
    {
        $_SESSION['VALIDATE_ERROR'] = '表单参数错误';
        header('location:index.php');
    }
}

appExceptionsViewException.php

<?php
namespace AppExceptions;

use AppServersView;

class ViewException extends Exception
{
    public function render()
    {
        View::make('error', ['error' => $this->getMessage()]);
    }
}

appServersValidate.php

<?php
namespace AppServers;

use AppExceptionsValidateException;

class Validate
{
    public static function make()
    {
        $_SESSION['VALIDATE_ERROR'] = '';
        if (empty($_POST['title'])) {
            throw new ValidateException('表单错误');
        }
    }
}

appServersView.php

<?php
namespace AppServers;

use AppExceptionsViewException;

class View
{
    public static function make(string $tpl, array $vars = [])
    {
        $file = 'view/' . $tpl . '.blade.php';
        if (!is_file($file)) {
            throw new ViewException($file . '模板不存在');
        }
        include $file;
    }
}

appviewerror.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1><?php echo $vars['error'];?></h1>
</body>
</html>

appviewindex.blade.php

<?php if(isset($_SESSION['VALIDATE_ERROR'])):?>
<?php echo $_SESSION['VALIDATE_ERROR'];?>
<?php endif;?>
    <form method="post" action="controller.php">
        <input type="text" name="title">
        <button>提交</button>
    </form>

appviewerror.blade.php

<h1>操作成功</h1>

appootstrap.php

<?php
session_start();
include 'vendor/autoload.php';
class Boot
{
    public function init()
    {
        set_exception_handler([$this, 'exception']);
    }
    public function exception($e)
    {
        if (method_exists($e, 'render')) {
            $e->render();
        }
    }
}
(new Boot)->init();

composer.json

{
    "name": "hd/app",
    "authors": [
        {
            "name": "houdunren.com",
            "email": "2300071698@qq.com"
        }
    ],
    "autoload": {
        "psr-4": {
            "App\": "."
        }
    },
    "require": {}
}

controller.php

<?php
include 'bootstrap.php';
use AppServersValidate;
use AppServersView;

include 'vendor/autoload.php';
// try {
Validate::make();
View::make('success');
// } catch (ValidateException $e) {
//     $e->render();
// } catch (ViewException $e) {
//     $e->render();
// }

index.php

<?php
namespace App;

include 'bootstrap.php';
use AppServersView;

View::make('index');

免责声明:文章转载自《PHP-异常处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇用Android 关于PopupMenu关于ios中富文本编辑的解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Windows7&amp;amp;IIS7.5部署Discuz全攻略

组长说在内网部署一个论坛,这可难不倒我,装个Discuz嘛。部署环境就一台普通的PC,四核i3,Windows7。这就开搞了。 准备工作 系统是Windows 7 专业版,自带IIS7.5(家庭版不带)。IIS7开始带了FastCgi,对PHP支持好了许多,所以也不必装Apache啦。下载 PHP 5.4、 MySQL 5.5 以及Discuz X2。 对...

关于C#中async/await中的异常处理(上)

关于C#中async/await中的异常处理(上) 2012-04-11 09:15 by 老赵, 17919 visits 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制。不过对于异步编程来说,异常处理一直是件麻烦的事情,这也是C#中async/awa...

用php编写我的第一段代码:hello world

一、php环境的搭建 在编写php前,先搭建php环境,我选择了一站式安装软件WampServer,WampServer的下载地址:http://www.wampserver.com/ WampServer的最新版本2.5内置: Apache 2.4.9 PHP 5.5.12 MySQL 5.6.17 安装也非常简单,一路下一步,搞定!安装成功以后,访问h...

java异常处理中的return和throw

如果把return和throw放在一起,直接会提示错误。”Unreachable statement”(无法被执行). 然而finally却可以成功骗过编译器让两者并存(是不是可以算是编译器的一个小bug呢),结果是后执行的会覆盖前者。 finally如果有return会覆盖catch里的throw,同样如果finally里有throw会覆盖catch...

PHP WEB安全问题

规则 1:绝不要信任外部数据或输入 关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据。外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据。在采取措施确保安全之前,来自任何其他来源(比如 GET 变量、表单 POST、数据库、配置文件、会话变量或 cookie)的任何数据都是不可信任的。 例如,下...

PHP迭代器模式

什么是迭代器模式  迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。 百度百科: http://baike.baidu.com/view/9791023.htm?fr=aladdin 解释 上面这名话可能多数人看得似懂非懂,什么叫...