2017-10-09 88 views
2

奇怪的是,我使用类似于基类Exception类的相同接口创建了一个类,但不能扩展/派生它。只是普通的PHP对象就像一个异常。我知道这不会像解释here一样工作,但是因为所有异常都像普通类一样,所以无论如何都试过。PHP,例外与常规类有什么不同

class MyException { 

/** 
* properties omitted 
*/ 

public function __construct(string $message = "",int $code) 

public function getMessage(void) 

//more methods 
} 

// somewhere in code block 

    throw new MyException("Fatal error"); 
    // Fatal error: exceptions must be valid objects derived from exception base class. 

您能否介绍一下其他方式,例外情况与常规类不同,以及它们如何在我们的代码中实现其例外作用。我知道这可能是一个愚蠢的问题,但我只是希望更多地了解异常是如何工作的。

+1

只能抛出[throwables](http://php.net/manual/en/class.throwable.php)。没有任何课程。这只是一种语言规则。 – apokryfos

回答

2

例外是普通类。它必须扩展'Exception',因为PHP不想检查它是否具有所有必需的方法/属性(由默认的PHP异常处理程序使用)。

通过扩展类(或实现接口),你可以证明你的类有类似'getMessage()'的方法,它不会抛出关于不存在的方法的错误。

它必须实现所有的Throwable接口方法(http://php.net/manual/en/class.throwable.php):

Throwable { 
    /* Methods */ 
    abstract public string getMessage (void) 
    abstract public int getCode (void) 
    abstract public string getFile (void) 
    abstract public int getLine (void) 
    abstract public array getTrace (void) 
    abstract public string getTraceAsString (void) 
    abstract public Throwable getPrevious (void) 
    abstract public string __toString (void) 
} 
1

Exception类只是容器程序员使用来传递有关异常的(信息的错误代码,消息,位置,栈跟踪,可能对处理异常有用的其他信息)从程序的一部分(发生异常的地方)到程序的其他部分(有代码知道如何处理它)。

它的构造函数只不过是将其接收的值存储为参数。其他方法只是getter;它们用于从Exception对象中提取值。 Exception类不实现任何行为。

除了要求延长Exception之外,没有什么特别的。

+0

这是否表明异常被PHP在解析时识别为特殊而不仅仅是一个类 –

相关问题