1

我目前正在使用 PHP。我正在为我正在构建的 CMS 开发一个错误系统(为了好玩)。对于我的系统中的致命错误(不是在 php 编译器中),我创建了一个 FatalException 类,它扩展了内置的 Exception 类。由于这些类型的错误无论如何都会使系统停止运行,因此我在 __construct 中退出了。

    class FatalException extends Exception{  
        public function __construct($message) {
            exit("<h1 style='color:red;' >FATAL ERROR: $message </h1>");
        }
    }

因此,在我的代码中,我将检查与数据库的连接之类的内容,如果不能,我将抛出 FatalException(“无法连接到数据库:$database_error_message”)。它不会在 try/catch 块中。

例如,当我运行代码并且无法连接到数据库时,我在屏幕上看到的只是一个大红色字母的句子。所以它工作得很好,但这是不好的做法/编码吗?

编辑:

事实上,它并没有以这种方式开始。我最初是在记录错误,然后在捕获区域中退出,但后来我想,如果所有致命错误无论如何都会退出,那么只需放入 in 构造函数。然后我注意到它实际上并没有到达它正在退出的捕获区域。因此,将语句放在 try/catch 块中是一个有争议的问题。这导致了这个问题。

4

3 回答 3

3

如果您要exit()无条件地使用构造函数,那么将其设为构造函数并没有多大意义,更不用说将类设为Exception. 您可以更简单(老实说)拥有一个名为Fatal::Die($message).

异常的意义在于它们描述了错误是什么(通过为不同的异常设置不同的类)并且可以被捕获——即使只是将它们记录到文件中并退出程序。

如果您网站的特定页面实际上可以在没有数据库连接的情况下正常处理(只是缺少“最新消息”或其他内容)怎么办?然后它可以catch( Database_Exception $e )继续,而您网站的其余部分则直接陷入最后的“哦,没有什么问题”消息。

对于您以外的其他人将使用的任何东西,大红色字母的消息也不是一个很好的错误处理机制 - 他们最终会在您不查看时看到错误的技术细节,或者您不知道发生了什么错误,因为您隐藏了该错误。

于 2013-04-11T21:28:45.437 回答
2

即使你包装exit()到一个异常的成员函数中,你也没有在这里使用异常来处理错误,而只是exit()- 永远不会抛出异常,PHP 会在此之前停止。

所以它工作得很好,但这是不好的做法/编码吗?

是的,这是不好的做法。如果您自己创建了一个函数,它也可以正常工作:

function error_exit($message) {
    exit("<h1 style='color:red;' >FATAL ERROR: $message </h1>");
}

相反,请考虑是要使用Excpetions还是要使用exit().

于 2013-04-11T21:31:23.750 回答
1

这是一个坏主意恕我直言。需要捕获异常才能正常运行。但是,您可以创建一个类似 ->error( $index ); 的方法。附着在您制作的每件物品上。从那里,您可以使用 try / catch 块将错误路由到特定类,以正确处理错误。

class TestClass 
{
    public function error( $index )
    {
        try 
        {
        // Convert index to exception and throw it.
        }
        catch ( Exception $e )
        {
        // Handle the error
        }
    } 
}
$a = new TestClass();
$a->error( 1000 );

请注意,这不适用于 php 抛出的异常,您需要单独捕获这些异常或使用执行中心。

于 2013-04-11T21:28:10.410 回答