我很快就开始在编程中使用异常,但我的问题是:我不知道应该使用什么异常,实际上我知道何时使用InvalidArgumentException
,但{{1}如何} 和别的?我阅读了PHP手册,但我仍然不知道何时使用每个例外。
这是我现在的主要问题,我想知道何时使用每个例外,以及为什么要使用例外?!
答案 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 exceptions和SPL exceptions)。他们每个人都有一个小的描述,告诉你它的目的。但是,您也可以定义自己的异常类,这些异常类可以从上述类之一扩展,也可以从Exception
本身扩展。
RuntimeException
实际上是运行时可能发生的异常的基类。您可以更好地使用其中一个特定的子类,而不是使用那个类,例如UnexpectedValueException
。
如果您确实使用了异常,您可能已经发现在except
块的try..except
子句中,您可以指定要捕获的异常类(另请参阅上面的代码示例) 。因此,如果您抛出特定的异常类型,您也可以更具体地捕获它们,而无需解析实际的错误消息。
不同异常类的主要目的是明确区分它们,因此您只需检查列表并找到最适合您的列表。此外,您可以扩展异常类并添加新功能,例如特定错误代码或不属于异常消息的其他元信息,但可能仍然对处理异常的人有用。