空例外类服务的目的是什么?

时间:2016-01-29 08:05:49

标签: php class exception exception-handling

我见过像以下例外的实现:

<?php

class TestE extends Exception {}

class MyTest {

    public function __construct() {
        try{
            throw new TestE('This is an exception!');
        }catch(Exception $exc){
            var_dump($exc);
        }

        echo '2';
    }
}

$o = new MyTest();

定义了TestE之类的自定义异常类,但保持为空,如上所述。它的目的是什么?我可以很容易地使用:

throw new Exception('This is an exception')

而不是

throw new TestE('This is an exception')

3 个答案:

答案 0 :(得分:1)

异常的名称会记录到日志文件/ rsyslog等。此外,您的框架可能有异常处理程序,通过检查抛出的异常的类名来处理特定类型的异常。

答案 1 :(得分:1)

这是一个比普通Exception更具体的错误。

您只能捕获该异常或其整个分支。

class PostException extends Exception {}
class LimitExceededOnPostException extends PostException {}

// When you need to catch any post-related exception...

try {

} catch (PostException $e) {

}

// When you need to catch exactly the `LimitExceededOnPostException`...

try {

} catch (LimitExceededOnPostException $e) {
    // do some related things
}

另请注意LogicExceptionRuntimeException之间的区别。一般来说,你不应该扩展Exception,扩展其中一个。

答案 2 :(得分:0)

扩展Exception类很有用,因为它允许更好地控制异常处理。

您发布的课程可以像这样使用:

try {
    // Some code that can throw Exception, InvalidArgumentException or TestE
    // depending on the specific issue it encountered

} catch (TestE $e) {
    // TestE is thrown when a specific issue happens; it requires particular handling
    // f.e. it can be logged and ignored because the program can continue 
} catch (InvalidArgumentException $e) {
    // This exception usually signals a coding error;
    // for example, an invalid type of an argument passed to a function
    // It needs a different handling than TestE; f.e. it can be logged
    // and a notification email sent to the developer
} catch (Exception $e) {
    // This is the most generic exception type
    // It catches all the exceptions that were not caught by the other branches
    // A specific handling is not possible for them; log them and exit the program
}

另一方面,类Exception包含您使用它们所需的所有成员和方法。通常不需要添加更多成员和方法。

这就是扩展Exception类的原因,但子类没有提供任何新功能(大部分时间)。