细说PHP中的Throwable

Error和Exception

PHP中的异常错误可以分为两大类:Exception(用户级异常)和Error(内部错误),用户级异常可以捕获代码逻辑上的异常,而代码错误、内存溢出这些异常则属于内部错误,在PHP5及以前,内部错误是无法被捕获的,程序会直接中断运行。PHP这个奇怪的设计给日常开发调试带来了极大的不便,我们平时只能靠自己的细心和经验来尽量避免出现这类问题。

PHP7之后的变化

Error的变化

PHP7开始内部错误可以被作为Error异常抛出了,既然能抛出,自然也是可以捕获的,同时也可以通过注册set_exception_handler进行处理,如果没有经过这些处理,则依旧会被报告称一个致命错误Fatal Error

由于PHP7开始Error成为了一个内置类,因此作为预定义的保留字段,我们是不可以在定义类的时候使用的,否则将会报错。

Throwable接口

PHP7新增了一个Throwable接口,ErrorException都实现了这个接口,将两个异常分支同一了,该接口的定义如下(可以看到Throwable的定义跟Exception几乎完全一样):

interface Throwable {
    /* Methods */
    public getMessage(): string
    public getCode(): int
    public getFile(): string
    public getLine(): int
    public getTrace(): array
    public getTraceAsString(): string
    public getPrevious(): ?Throwable
    public __toString(): string
}

我们可以通过Throwable来同时捕获ErrorException,直接使用try/catch来实现即可:

try {
    // ...
} catch (\Throwable $t) {
    // Error或者Exception
}

开发者不能直接实现Throwable接口,只能继承Exception,这样设定的目的是确保PHP的异常错误只可以有ExceptionError两大类。可以通过一个继承Throwable接口的自定义接口来创建额外的方法,然后通过一个继承了Exception的类来实现它:

interface UserThrowable extends Throwable {}
class UserException extends Exception implements UserThrowable {}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇