应该使用的例外情况是什么?

时间:2014-08-05 11:58:01

标签: php exception

我很快就开始在编程中使用异常,但我的问题是:我不知道应该使用什么异常,实际上我知道何时使用InvalidArgumentException,但{{1}如何} 和别的?我阅读了PHP手册,但我仍然不知道何时使用每个例外。

这是我现在的主要问题,我想知道何时使用每个例外,以及为什么要使用例外?!

1 个答案:

答案 0 :(得分:1)

是否使用例外

是否使用例外的讨论是一个艰难的问题。有些使用异常很多,几乎就像控制流语句一样。每次发生意外情况时,都会抛出异常。例如,您可以构建一个验证电子邮件地址的函数,并在失败时抛出异常。您的代码可能如下所示:

// This is declared somewhere in a central place.
class VerificationException extends RuntimeException
{
}

// This is the code in your form validation process.
try
{
  verifyName($_POST['email']);
  verifyEmail($_POST['email']);
  verifyPhoneNumber($_POST['email']);
}
catch (VerificationException $e)
{
  // Show the error to the user here.
}
catch (Exception $e)
{
  // Any other error. Log it, let the script fail... you decide.
}

其他人发现你根本不应该使用例外。他们说,你应该只返回false或一些错误代码,并且不使用异常,因为它们会使代码更难调试。因此,函数verifyEmail应该只在其书中返回false。 您的代码将是这样的:

if (verifyName($_POST['email']) === false) {
  // Handle this failed verification.
}
if (verifyEmail($_POST['email']) === false) {
  // Handle this failed verification.
}
if (verifyPhoneNumber($_POST['email']) === false {
  // Handle this failed verification.
}

我不会介入更好的讨论,(不管怎么说都不适合SO),但是让我说我​​介于两者之间。不同之处在于,如果没有捕获,则异常只会冒泡到更高级别。如果您不存储函数的结果,那么结果就会消失,但是异常可以在调用函数或调用者的调用者中捕获,甚至可以在脚本中的非常高级别捕获。这允许更大的灵活性,但也使得程序的结构更难以遵循。

PHP的内置异常类和自定义异常类

PHP提供了几个异常类(请参阅reserved exceptionsSPL exceptions)。他们每个人都有一个小的描述,告诉你它的目的。但是,您也可以定义自己的异常类,这些异常类可以从上述类之一扩展,也可以从Exception本身扩展。

RuntimeException实际上是运行时可能发生的异常的基类。您可以更好地使用其中一个特定的子类,而不是使用那个类,例如UnexpectedValueException

如果您确实使用了异常,您可能已经发现在except块的try..except子句中,您可以指定要捕获的异常类(另请参阅上面的代码示例) 。因此,如果您抛出特定的异常类型,您也可以更具体地捕获它们,而无需解析实际的错误消息。

不同异常类的主要目的是明确区分它们,因此您只需检查列表并找到最适合您的列表。此外,您可以扩展异常类并添加新功能,例如特定错误代码或不属于异常消息的其他元信息,但可能仍然对处理异常的人有用。