gpt4 book ai didi

php - 简单异常示例 - PHP

转载 作者:可可西里 更新时间:2023-10-31 22:06:52 27 4
gpt4 key购买 nike

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

我有类(class)员工:

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 block 是个好主意 - 但这似乎不起作用 - 我需要在类里面有一个 try catch block - 这是看待这个问题的正确方式吗?

谢谢

最佳答案

我想你的意思是你想做这样的事情:

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 block 将只捕获定义类时发生的任何异常。当您尝试实例化它时,它们不会被捕获,因为您的 new Employee 行在 try/catch block 之外。

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

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

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

关于php - 简单异常示例 - PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5918067/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com