简单的异常示例 - PHP

时间:2011-05-06 23:34:48

标签: php oop

我试图了解在以下场景中处理异常的最佳方法是什么:

我有一名班级员工:

class employee extends person {
    private $salary;
    private $baseSalary = 6.5;

    function __construct($f, $m, $l, $a,$fsalary=0){
        if(!is_numeric($fsalary)){
            throw new Exception("Age supplied is not a number", 114);
        }
        parent::__construct($f, $m, $l, $a);    
        $this->salary=$fsalary;
    }
    function GetDetails(){
         return parent::GetName().
                "<br/>".
                $this->salary;
    }
    function __toString(){
        return $this->GetDetails();
    }

}

使用这个:

try{
    if(!$f = new employee("Sarah", "Sebastian", "Pira", "abc")){
        throw new Exception();
    }
    else {
        echo $f;        
    }

}
catch (Exception $e){
    echo "<br/>";
    echo var_dump($e);
}

现在我认为在类中抛出异常然后在所有使用employee对象的脚本中只使用一个catch块是个好主意 - 但这似乎不起作用 - 我需要在课堂上尝试一下catch块 - 这是看这个的正确方法吗?

由于

2 个答案:

答案 0 :(得分:4)

我认为你所说的是你想做这样的事情:

try {
    class Employee extends Person {
        // ...blah blah...
    }
}
catch(Exception $e) {
    // handle exception
}

...然后能够在其他类中对其进行实例化,而不会明确地捕获任何异常:

// try { << this would be removed
    $employee = new Employee();
// }
// catch(Exception $e) {
//    (a whole bunch of code to handle the exception here)
// }

你不能这样做,因为那时类中的try / catch块只会捕获定义类时发生的任何异常。当您尝试实例化它们时,它们不会被捕获,因为您的new Employee行在try / catch块之外。

实际上,您的问题是您希望能够在多个位置重用try / catch块而无需重新编写代码。在这种情况下,您最好的解决方案是将catch块的内容移出到可以根据需要调用的单独函数。在Employee类文件中定义函数并将其调用如下:

try {
     $employee = new Employee();
     $employee->doSomeStuff();
     $employee->doMoreStuffThatCouldThrowExceptions();
}
catch(Exception $e) {
    handle_employee_exception($e);
}

它并没有摆脱每个文件中的try / catch块,但它确实意味着您不必一直复制异常处理的实现。并且不要将handle_employee_exception定义为类的实例方法,将其作为单独的函数执行,否则如果在构造函数中抛出异常将导致致命错误,因为该变量将不存在。

答案 1 :(得分:4)

您应该阅读有关Exceptions in PHP的更多信息。

当然,您可以在类的方法中处理异常。但是你应该重新思考你想做什么以及......为什么。

良好实践也是创建自己的异常类,因此您可以区分模块/类抛出的异常与其他异常抛出的异常。看起来像那样(see more):

class EmployeeModule_Exception extends Exception {}

当涉及到抛出异常时:

// the second parameter below is error code
throw new EmployeeModule_Exception('some message', 123);

捕获类似,只有下面的示例才会捕获模块的例外情况:

try {
    // some code here
} catch (EmployeeModule_Exception $e) {
    // display information about exception caught
    echo 'Error message: ' . $e->getMessage() . '<br />';
    echo 'Error code: ' . $e->getCode();
}