简单的异常示例 - PHP

4

我希望了解在以下场景中如何处理异常的最佳方法:

我有一个名为employee的类:

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);
}

现在我认为在类中抛出异常并在所有使用员工对象的脚本中只使用一个catch块是个好主意,但是这似乎行不通——我需要在类内部使用try catch块——这是正确的做法吗?

谢谢


哪个部分不起作用?你在第二个代码块中期望发生什么?它读起来好像不会抛出任何异常,只会回显 Sarah Sebastian Pira <br/> 0,对吧? - matt
如果员工对象在单独的脚本中使用,则当创建对象时,类的catch块不会被触发。我的问题是,是否可能在类中定义一个try catch块,而不是在每个使用员工对象的实例上都有一个try catch块? - digital_paki
当使用这种方法时,我会收到致命错误,指出异常未被捕获。 - digital_paki
1
仅供参考:在PHP中,使用以小写字符开头的类名和以大写字符开头的方法名是非常不寻常的编码风格。通常应该是class Employee extends Personfunction getDetails - GodsBoss
另一个提示:1)不要抛出空异常!2)不要在条件语句中使用赋值(除非你真的知道自己在做什么 - 并且理解它的工作原理)。 - Tadeck
2个回答

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)
// }

由于您的 new Employee 行在try / catch块之外,所以该类中的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定义为类的实例方法,而是将其作为一个单独的函数,否则如果异常在构造函数中抛出,变量将不存在,这将导致致命错误。


4

您应该阅读更多关于PHP中的异常

当然,您可以在类的方法中处理异常。但是您应该重新考虑如何处理异常以及为什么要这样做。

良好的实践还包括创建自己的异常类,这样您就能够区分由您的模块/类抛出的异常和其他模块/类抛出的异常。它看起来像这样(查看更多):

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接