如果定制的EXCEPTION搞定了,默认的,就自然不在话下罗。

直接上最曲折的过程。

InvalidIdException.php

<?php

namespace Bookstore\Exceptions;

use Exception;

class InvalidIdException extends Exception {
    public function __construct($message = null) {
        $message = $message ?: 'Invalid id provided.';
        parent::__construct($message);
    }
}
?>

ExceedeMaxAllowedException.php

<?php

namespace Bookstore\Exceptions;

use Exception;

//从默认的Exception继承
class ExceedeMaxAllowedException extends Exception {
    //只有构造函数
    public function __construct($message = null) {
        //PHP新语法,如果$message为空,则取默认值
        $message = $message ?: 'Exceeded max allowed.';
        //调用父类构造函数,传递消息
        parent::__construct($message);
    }
}

?>

Unique.php

<?php
namespace Bookstore\Utils;

use Bookstore\Exceptions\InvalidIdException;
use Bookstore\Exceptions\ExceedeMaxAllowedException;

require_once __DIR__ . '/InvalidIdException.php';
require_once __DIR__ . '/ExceedeMaxAllowedException.php';

trait Unique {
    //static静态属性,类似于其它语言的类变量
    private static $lastId = 0;
    //protected保护属性,仅允许继承类访问
    protected $id;

    public function setId(int $id) {
        if ($id < 0) {
            //抛出自定义异常
            throw new InvalidIdException('Id cannot be negative.');
        }
        //内置函数判断id是否为空,比$id == null要逼格好点
        if (empty($id)) {
            //注意区分$this-和self::$的语法
            $this->id = ++self::$lastId;
        } else {
            $this->id = $id;
            if ($id > self::$lastId) {
                self::$lastId = $id;
            }
        }
        if ($this->id > 50) {
            //抛出自定义异常
            throw new ExceedeMaxAllowedException('Max number of users is 50.');
        }
    }

    public function getId():int {
        return $this->id;
    }

    //静态方法
    public static function getLastId():int {
        return self::$lastId;
    }

}

?>

test.php

function createBasicCustomer($id) {
    //捕获异常
    try {
        echo "\nTrying to create a new customer.<br/>";
        return new Basic($id, "name", "suname", "email");
    } catch (InvalidIdException $e) {
        echo 'You cannot provide a negative id:'
            . $e->getMessage() . "<br/>";
    } catch (ExceedeMaxAllowedException $e) {
        echo 'No more customer are allowed:'
            . $e->getMessage() . "<br/>";
    } catch (Exception $e) {
        echo 'Unkown exception:'
            . $e->getMessage() . "<br/>";
    } finally {
        echo "End of function.<br/>";
    }
}

$basic = createBasicCustomer(1);
$basic = createBasicCustomer(-1);
$basic = createBasicCustomer(55);

输出:

Trying to create a new customer.
End of function.
Trying to create a new customer.
You cannot provide a negative id:Id cannot be negative.
End of function.
Trying to create a new customer.
No more customer are allowed:Max number of users is 50.
End of function.

php中的Exception的更多相关文章

  1. .NET Core学习笔记(3)——async/await中的Exception处理

    在写了很多年.NET程序之后,年长的猿类在面对异步编程时,仍不时会犯下致命错误,乃至被拖出去杀了祭天.本篇就async/await中的Exception处理进行讨论,为种族的繁衍生息做出贡献……处理a ...

  2. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  3. Thinking in java中关于Exception的一道面试题.

    今天看到Thinking in Java中一个关于Exception的例子:最后看到有一篇总结的比较好的文章, 这里拿来记录下, 文章地址是:http://blog.csdn.net/salerzha ...

  4. java 中的Exception RuntimeException 区别

    在java的异常类体系中: 1.Error和RuntimeException是非检查型异常,其他的都是检查型异常; 2.所有方法都可以在不声明throws的情况下抛出RuntimeException及 ...

  5. Python中异常(Exception)的总结

    Python中的异常处理 异常处理的语句结构 try: <statements> #运行try语句块,并试图捕获异常 except <name1>: <statement ...

  6. Oracle中的EXCEPTION

    Oracle系统预定义的异常 比如:SELF_IS_NULL.VALUE_ERROR.ZERO_DIVIDE等Oracle中自带的异常类型 使用方法: DECLARE V_Result ); BEGI ...

  7. java中的exception stack有时候不输出的原因(转)

    原文  https://www.cnblogs.com/lemonlotus/p/5650687.html 有时候,我们在看java错误日志时,只看到一个java.lang.NullPointerEx ...

  8. Abp中自定义Exception的HttpStatusCode

    Abp中在新版本中,抛出的异常(比如:UserFriendlyException)通过AjaxResponse封装后返回的时候,HttpStatusCode默认指定成了500. 对于一些默认封装好的处 ...

  9. java中的exception stack有时候不输出的原因

    有时候,我们在看java错误日志时,只看到一个java.lang.NullPointerException,却没有看到错误的栈,原因是启动时候有一项参数可以选择配置:OmitStackTraceInF ...

  10. GUI学习中错误Exception in thread "main" java.lang.NullPointerException

    运行时出现错误:Exception in thread "main" java.lang.NullPointerException 该问题多半是由于用到的某个对象只进行了声明,而没 ...

随机推荐

  1. java web开发入门三(Hibernate)基于intellig idea

    Hibernate 1.开发流程 项目配置好后的结构: 1.下载源码: 版本:hibernate-distribution-3.6.0.Final 2.引入hibernate需要的开发包(3.6版本) ...

  2. Maven 教程(11)— Maven远程仓库的各种配置

    原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79545408 1.远程仓库的配置 在平时的开发中,我们往往不会使用默认的中央仓库 ...

  3. mknod命令的使用

    1.mknod命令 在Linux系统下,mknod命令可用于系统下字符设备文件和块设备文件的创建. (1)命令语法 mknod(选项)(参数) (2)常用选项说明 -Z:设置安全的上下文. -m:设置 ...

  4. 解决wireshark抓包校验和和分片显示异常

    问题描述: 在使用wireshark抓取报文时,发现从10.81.2.92发过来的报文绝大部分标记为异常报文(开启IPv4和TCP checksum) 分析如下报文,发现http报文(即tcp pay ...

  5. [转帖]美团在Redis上踩过的一些坑-3.redis内存占用飙升

    美团在Redis上踩过的一些坑-3.redis内存占用飙升 博客分类: 运维 redis redismonitor内存突增client listinfo     转载请注明出处哈:http://car ...

  6. Spring JPA事务

    目录 1. 概述 促进阅读: 2. 配置不带XML的事务 3. 使用XML配置事务 4. @Transactional 注解 5. 潜在的陷阱 5.1. 事务和代理 5.2. 更改隔离级别 5.3. ...

  7. C++指针与数组、函数、动态内存分配

    C++指针 指针是用来存储地址的变量. 对于二维数组来说: a:代表的是首行地址: *a:代表的是首元素地址: **a:首元素: a+1:第二行地址: *a+2:首先*a是首元素地址,在首元素地址上+ ...

  8. Python-06-函数

    一.函数的定义 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 1. 定义方式 def 函数名(参数1,参数2 ...

  9. Go语言系列教程(十二)之函数完结篇

    Hello,各位小伙伴大家好,我是小栈君.上一期我们讲到了关于函数的有参.无参.匿名函数,本期我们分享一下关于go语言函数类型.匿名函数和闭包的概念和实战.闲话不多说,立马开始分享. 在Go语言中,函 ...

  10. Tomcat 配置文件解析工具 Digester

    Digester 是一个依据 xml 配置文件动态构建 Java 对象树的工具,基于 SAX 解析器进行封装,它为 SAX 事件的处理提供了更高级和友好的接口,让开发更专注于要执行的处理,隐藏了 XM ...