我正在开发一个基于类的php web应用程序。我有一些对象正在交互的地方,并且我在某些情况下使用错误代码与最终用户进行通信 - 通常在表单值丢失或无效时。在这些情况下,例外情况是没有根据的(我不确定我是否可以避免出现例外情况)。
在一个对象中,我有大约20个代码编号,每个代码编号对应于面向用户的消息,以及面向管理员/开发人员的消息,因此双方都知道发生了什么。现在我已经多次处理了代码,我发现很难快速找出我已经使用过的系列中的代码编号,所以我不小心创建了相互矛盾的代码。例如,我今天只用12,13,14和15做了。
如何更好地组织这个以便我不会创建冲突的错误代码?我应该创建一个单独的类,errorCodes,它有一个包含所有类的所有错误代码的主列表,在整个Web应用程序中将它们系统化?或者,在适当的时候,每个对象应该有自己的一组错误代码,我只是在对象的注释中保留一个列表,在我进行时使用和更新它?
<小时/> 编辑:所以我喜欢在类中使用常量或命名常量的建议。这给了我一个地方,我以编程方式定义并跟踪错误代码及其消息。
下一个问题:我为这个类的错误代码和消息提供了什么样的接口?我是否在类中执行triggerError(20)
之类的操作,然后提供一个公共方法来返回错误代码,字符串常量以及面向用户和管理员的消息?
答案 0 :(得分:8)
您可以为所有错误代码创建一些defines
来创建命名常量:
define('ERROR_CODE_SQL_QUERY', 1);
define('ERROR_CODE_PAGE_NOT_FOUND', 2);
define('ERROR_CODE_NOT_ALLOWED', 3);
// and so on
然后,使用代码中的常量:
if ($errorCode == ERROR_CODE_SQL_QUERY) {
// deal with SQL errors
}
有了这个,你的代码中没有任何地方你会使用数值:无处不在(除了你放define
s的开启和唯一文件),你将使用这些代码。
这意味着:
另一个想法可能是创建一个类来处理错误:
class Error {
const CODE_SQL_QUERY = 1;
const CODE_PAGE_NOT_FOUND = 2;
const CODE_NOT_ALLOWED = 3;
// Add some methods here, if needed
}
然后,使用这样的东西:
if ($errorCode == Error::CODE_SQL_QUERY) {
// deal with SQL errors
}
哪一个最好?
这可能是个人偏好的问题......如果您需要添加一些方法来处理错误,使用类可能会有用。另外,定义也是一个很好的解决方案。
答案 1 :(得分:1)
至少,您可以将代码数量提升为类常量或成员吗?
class MyErrorProneClass {
const TURNED_INTO_A_NEWT = 12;
...
public function dontBurnMe() {
// echo your error here using self::TURNED_INTO_A_NEWT
}
通过这种方式,您可以在使用它们的同一位置管理错误,而不必维护大型中央文件。我过去曾尝试过这种效果,但很难跟上。
以编程方式生成错误编号可能是更好的长期解决方案。如果您可以使用有关文件或行号的信息(分别为__FILE__
和__LINE__
),那将有所帮助。
希望至少朝着正确的方向前进。
谢谢,乔
编辑:
类成员将遵循以下语法:
class MyErrorProneClass {
protected static $turnedIntoANewt = 12;
...
public function dontBurnMe() {
// echo your error here using self::$turnedIntoANewt
}
由于常量默认是公共的,因此如果需要,可以直接从其他类访问它们。因此,从外部来看,错误将被引用为:
MyErrorProneClass::TURNED_INTO_A_NEWT
要与消息关联,您可以使用从错误ID(和前端/后端)到显示字符串的映射(在数据库中或在某些本地化文件中)。对消息使用密钥并不是最佳选择,但它允许您在不更改代码的情况下更改错误消息。
答案 2 :(得分:0)
如果您不知道使用trigger_error()可能是个主意,如果您想向用户显示更好的错误消息,还可以使用错误处理程序。
答案 3 :(得分:0)
您是否考虑过使用exceptions?对于您的问题,它们可能是一个很好的选择,虽然现在将它们添加到您的项目中可能需要进行一些重组。
您可以扩展基本异常类,以便在用户/开发人员错误消息分离方面适合您的问题。