新手:throw new exception - 我们能改变异常名称吗?

3

我正在尝试处理异常。

因此,我有类似这样的代码:

如果发生了不好的事情:

throw new CreateContactException($codigo, $result->msg);

稍后,我会尝试并如果不行就捕获:
try 
{
  createContact();
}
catch(CreateContactException $e) 
{
  $error .= 'An error occurred with the code:'.$e->getCode().' and message:'.$e->getMessage();
}

1) 这个代码会起作用吗?我的意思是,这个getCode()和getMessage()方法与CreateContactException参数没有关系,对吗?

2) 我必须在某处有一个扩展Exception的CreateContactException类吗?我的意思是,我们可以为自己的异常使用自定义名称,而不需要创建一个扩展类吗?

非常感谢您的提前帮助, MEM

1个回答

12

异常必须是内置的Exception类的子类,因此您可以像这样创建新的异常:

class CreateContactException extends Exception {}

试图将其他类作为异常抛出会导致错误。

使用不同的名称的优点是可以有多个catch块,这样您就可以捕获不同类型的异常并让其他异常继续传播:

try {
    // do something
}
catch (CreateContactException $e) {
    // handle this
}
catch (DomainException $e) {
    // handle this
}

好的。那么第一件事就是创建一个扩展 Exception 的类。如果它是空的,为什么不直接使用 Exception 呢? - MEM
假设我们已经创建了那个类,我们如何将getCode和getMessage与我们的throw参数相关联呢? 我有点迷失了,我意识到这一点...再次感谢 - MEM
1
为什么不直接使用Exception呢? 因为你想要更具体地抛出和捕获特定的异常类型。 由于它扩展了Exception,所以继承了所有Exception的方法,因此getCode和getMessage将起作用。 - Mchl
"getCode和getMessage会起作用" - 好的。 但是它们将如何与之前作为throw参数传递的$codigo、$result->msg相关联? - MEM
@MEM,请参考以下文档:http://us2.php.net/manual/zh/language.exceptions.extending.php http://us2.php.net/manual/zh/class.exception.php - strager
好的。;) 我们去那里吧。感谢添加 Daniel,现在我更好地理解使用自定义异常名称的优点。 - MEM

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