捕获所有类型的断言

San*_*ade 8 c++

我需要一个像这样的条件:

try
{
//bug condition
}
catch()
{
//Remove file
}
Run Code Online (Sandbox Code Playgroud)

那就是我创建了一个非常机密的文件,第三方无法查看数据,但是当代码中出现任何错误时,我的文件被删除,因为我不确切知道错误发生的地方.

所以我想使用try和catch来捕获该bug,并希望删除该文件.如何在C++中捕获任何异常?

如果有错误,那将删除文件.

喜欢:

try
{
    char TempArray[10];
    char c = TempArray[11];
}
catch
{
    cout<<"Array out of boundry";
    deleteFile("Confi.txt");
}
Run Code Online (Sandbox Code Playgroud)

Ela*_*zar 8

关于安全性的一句话:如果您在硬盘上创建一个带有机密信息的文件,任何人都可以在进程运行且文件仍处于打开状态时关闭计算机,取出硬盘并读取其内容.

如果文件在服务器上,您可以通过在删除文件之前暂停进程来完成相同的操作.

即使您从文件系统中删除了文件,很可能仍然可以读取它,因为删除文件不会擦除其内容.

在你拥有所需的专业知识之前,我建议不要处理机密信息 - 而不是从SO学习.但是,如果你必须这样做,我认为这里建议的看门狗进程+加密是要走的路.


And*_*owl 5

首先:

你不想那样做。

异常不是为了处理错误,而是运行时错误条件,使您的函数无法满足它必须调用的其他函数的先决条件,或遵守履行自己的后置条件的承诺(假设调用者已满足先决条件)。例如,参见Herb Sutter 的这篇文章

永远不要写这样的东西:

try
{
    //bug condition <== NO! Exceptions are not meant to handle bugs
}
catch()
{
    //Remove file
}
Run Code Online (Sandbox Code Playgroud)

反而:

assert( /* bug condition... */ );
Run Code Online (Sandbox Code Playgroud)

回到问题:

您的程序具有未定义的行为,并且很可能在您执行以下操作时根本不会抛出任何异常:

char TempArray[10];
char c = TempArray[11];
Run Code Online (Sandbox Code Playgroud)

因此,捕获所有异常无济于事。这是一个错误,即编程错误,您是否应该以将控制权转移到有问题的例程的方式处理错误是有争议的;此外,如果您承认程序中存在错误,难道您不能将控制权转移给有问题的处理程序吗?这可能会使情况变得更糟。

应该通过防止错误、使用断言、可能采用测试驱动开发等方法来处理错误。

这就是说,关于捕获所有异常的方法,您可以执行以下操作:

try
{
    // ...
}
catch (...) // <== THIS WILL CATCH ANY EXCEPTION
{
}
Run Code Online (Sandbox Code Playgroud)

但是catch (...)不鼓励使用作为设计指南,因为它很容易导致吞下本应处理的错误条件并忘记它们。毕竟,发明异常正是为了防止程序员忘记检查错误代码,并且catch (...)使之变得如此简单。

出于包罗万象的目的,最好让所有异常都从 派生std::exception,然后执行以下操作:

try
{
    // ...
}
catch (std::exception& e)
{
    // Do something with e...
}
Run Code Online (Sandbox Code Playgroud)

  • *“但这被认为是糟糕的编程风格”*。仅仅因为一种机制可以被滥用并不能使它成为糟糕的编程风格。`catch(...)` 有很多有效的用例,如果你用它盲目地隐藏不应该隐藏的问题,那只会是不好的。 (4认同)