【发布时间】:2012-01-15 11:53:21
【问题描述】:
我正在将 PEAR 的Text_LanguageDetect 的错误处理重写为异常,不知道如何处理异常中的动态数据:
throw new Text_LanguageDetect_Exception(
'Language database does not exist.',
Text_LanguageDetect_Exception::DB_NOT_FOUND
);
这里我想包含试图打开的文件名,但问题是放在哪里:
Language database /path/to/file.ext does not exist.Language database "/path/to/file.ext" does not exist.Language database does not exist: /path/to/file.extLanguage database does not exist: "/path/to/file.ext"
1+2 是正确的英文句子,而 3+4 可以很容易地 grep 代码中的消息。另外,用代码提取文件名在 3+4 中更容易。
我应该使用哪一个,为什么?
另一个问题是:我应该把文件名放在哪里?
当我把它放在异常消息中时,如果攻击者看到该消息,它可能会向攻击者提供有关服务器上文件结构的信息。没有文件名,就很难调试。
【问题讨论】:
-
由于应该在生产服务器上禁用错误消息,我没有看到有关攻击者深入了解文件结构的问题。预测组件用户的错误配置不是组件编写者的责任。关于我更喜欢哪条消息:4.除此之外,它是一个民意调查类型的问题,我猜不适合 SO。
-
使用
sprintf(),这样您就可以更轻松地解耦和更改内容,同时保持代码干净。接下来,检查整个组件的样式,以便始终保持相似,这将减少学习曲线。提供对 API 用户处理异常有用的所有信息。 -
这不是民意调查。我想得到答案为什么我应该使用一个选项,而不是谁使用什么。
-
@cweiske 就是这样。他们不会给你理由 :) 我会选择 4,因为它对我来说最容易理解(这和其他任何理由一样好)。我可能会在其中添加一个“at”以使其成为一个完整的句子:语言数据库不存在于“/path/to/file.ext”。另外,我可能会添加解决方案的建议,例如检查文件路径并确保其可读或其他内容。