gpt4 book ai didi

php - 在 php 中组织技术和面向用户的错误消息

转载 作者:可可西里 更新时间:2023-10-31 22:16:57 25 4
gpt4 key购买 nike

我在组织两个交互类的错误消息时遇到了一些麻烦。一个对象具有“类似错误”的状态,其中出现错误或意外发生,但情况仍然可以挽救。我不想使用异常,1. 因为它们只有一个字符串用于消息,2. 因为我想在错误发生后访问对象。最起码,我想用它的一些get()方法在异常发生后构造一个有用的错误信息!

最终,我有两条消息要传达:一条是给我作为编码员的我自己,那就是出了点问题。该字符串将包含文件、行、函数/方法、参数和结果的技术细节。显然,我不想向用户显示此内容,因此我想向用户显示另一串错误消息(“找不到该电子邮件地址”之类的东西)。

所以我想到构建一个错误消息数组,它可以使用来自异常的错误代码或状态代码作为各种消息的键。 (虽然如果我这样做,我应该在哪里存储消息数组?)另一种选择可能是创建一个错误状态对象。

有没有类似于设计模式的“错误模式”?

最佳答案

异常确实是你最好的选择,它们会做你要求的一切。甚至多条消息也是可能的,因为异常只是您可以扩展的类。您可以将导致异常的对象传递给所述异常。

<?php
class ExampleException extends Exception {
private $secondMessage;
private $objectThatCausedIt;
public function __construct( $secondMessage, $objectThatCausedIt ) {
parent::__construct(
"Descriptive message for developer",
// error code for this type of error
1000 );
$this->secondMessage = $secondMessage;
$this->objectThatCausedIt = $objectThatCausedIt;
}
public function getSecondMessage() {
return $this->secondMessage;
}
public function getObjectThatCausedIt() {
return $this->objectThatCausedIt;
}
}

class Example {
public function causeException() {
throw new ExampleException( "Second Message", $this );
}
}

现在您只需使用该类并将可能引发异常的调用包装在 try-catch block 中即可。

<?php
$example = new Example();
try {
$example->causeException();
}
catch ( ExampleException $e ) {
// kind of pointless here, just an illustration
// get object that caused it and do something with it.
dump_and_log_function( $e->getObjectThatCausedIt() );
// or just use $example, which is still "alive"
// and references the same instance
dump_and_log_function( $example );
}

Extending Exception 的好处是您还可以获得堆栈回溯。回溯包含异常发生在哪个文件、行和函数中的信息。您还可以访问错误代码、消息等。我建议您阅读有关异常的 PHP 文档 (http://php.net/manual/en/class.exception.php) 以获取更多信息。

关于错误消息和日志记录,我通常为此使用单例类。单例类本身只有一个实例(以防您不知道。)这是一个极其简单的示例:

<?php
class Log {
private $logFile;
private static $instance;
/* Log instances may only be constructed in Log::getInstance */
private function __construct() {
$this->logFile = fopen( "path/to/log/file", "a" );
}
public logMessage( $message ) {
fwrite( $this->logFile, $message );
}
public static getInstance() {
if ( !self::$instance ) self::$instance = new self();
return self::$instance;
}
}

现在回到异常处理throw-catch block ,你可以把它改成这样:

<?php
$example = new Example();
try {
$example->causeException();
}
catch ( ExampleException $e ) {
// log developer message and backtrace
Log::getInstance()->logMessage( $e->getMessage() );
Log::getInstance()->logMessage( $e->getTraceAsString() );
// or more compact by casting to string
Log::getInstance()->logMessage( (string)$e );
// and now print error for users
echo "<p>An Error has occured: {$e->getSecondMessage()}</p>";
}

您可以让 Log 类具有包含消息数组的属性,而不是立即回显错误消息。然后您可以稍后在 View 脚本中一次列出它们。您还可以使 logMessage 方法将消息存储在 session 中,以便它们可以在刷新后显示(只是不要忘记从 session 中清除消息,否则它们将一遍又一遍地显示;-)。

关于php - 在 php 中组织技术和面向用户的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2044749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com