C++;新手问题——使用try、throw、catch处理基本错误 我试图理解C++中的错误处理。< /P>

C++;新手问题——使用try、throw、catch处理基本错误 我试图理解C++中的错误处理。< /P>,c++,exception-handling,C++,Exception Handling,我已经读到,使用try、throw、catch比使用带有返回值的if语句更好,也更简单。但我不确定我是否真的明白“试、扔、抓”是如何起作用的。我在下面举了一个简单的例子,如果能得到关于任何问题或糟糕风格的反馈,那就太好了。我的目标是从示例中生成一个函数,用于检查另一个计算的结果 以下是关于尝试、投掷、接球的问题: (1) 我的函数中应该包含catch语句吗?或者它应该在其他地方,比如main()中,或者在完成初始计算的函数中 (2) 用try、catch、throw来做这么简单的事情(我想改进我

我已经读到,使用try、throw、catch比使用带有返回值的if语句更好,也更简单。但我不确定我是否真的明白“试、扔、抓”是如何起作用的。我在下面举了一个简单的例子,如果能得到关于任何问题或糟糕风格的反馈,那就太好了。我的目标是从示例中生成一个函数,用于检查另一个计算的结果

以下是关于尝试、投掷、接球的问题: (1) 我的函数中应该包含catch语句吗?或者它应该在其他地方,比如main()中,或者在完成初始计算的函数中

(2) 用try、catch、throw来做这么简单的事情(我想改进我的风格)是不是太过分了

(3) 如果有错误,我想终止程序。我该怎么做?还是“捕获”意味着这是自动完成的

(4) 我不明白cerr的用途。为什么不用cout呢?我在这里正确使用了cerr吗?我是否也应该在if/else语句中使用它

非常感谢你的帮助

我举了一个例子:

double calculated = 10.2; // from previous calculation
double tolerance = 0.3; // I can set this in this function
double valueWanted = 10.0; // from previous calculation

const int calcError = 5; // I picked this number randomly to use for indicating an error

try
{
   if (fabs(fTargetValue - fCalculated) <= fTolerance)
     cout << "Result is within range.";

   else
     cout << "Failed.";
     throw calcError;
}

catch (const int calcError)
{
   cerr << "The calculation failed.\n" << endl;
}
双重计算=10.2;//根据先前的计算
双公差=0.3;//我可以在这个函数中设置它
双值通缉=10.0;//根据先前的计算
常量int calcError=5;//我随机选取这个数字来表示错误
尝试
{

如果(fabs(fTargetValue-fCalculated)确定,首先您的示例每次都会抛出,因为在
else
之后没有范围括号。因此,只有
可以
  • catch语句应该位于抛出的第一个函数中(可能位于抛出的函数中),该函数可以从异常中恢复并允许程序正常继续

  • 是的,如果你希望捕获它,那么抛出就没有意义了。另外,你的正常程序流不应该抛出。根据经验,只有当你陷入一种你真的不希望发生的情况时才抛出。异常被称为异常,因为它们发生在异常情况下。通常是使用异常的好时机离子是指与程序环境交互时。您通常希望某些事情能够正常工作,例如能够分配内存、打开文件、从网络设备接收完整的数据包等。所有这些情况都会导致引发异常。此外,如果您的程序接收到输入,它最初应该对其进行验证。但是,稍后,在处理过程中,如果本应被验证拒绝的数据出现错误,例如由于奇怪的输入数据而出现被零除的情况,这也将是一种例外情况。如果在预期的情况发生时过分依赖异常,则程序的流和逻辑可能会被覆盖很难推理,程序维护变得不必要的困难

  • 如果出现错误,就不要捕获。如果没有捕获,异常将一直传到主函数,然后转到运行时,该运行时将终止程序。对于某些操作系统(如windows),这将导致创建一个小型转储文件,您可以使用该文件调试程序,以找出是什么原因在例外情况下,它终止了

  • cerr和cout仅提供两种从程序输出信息的方法。如果另一个程序使用您的程序的输出来执行某项操作,它将读取cout并期望理解它。这意味着如果您要写出错误或警告,说明使用程序无法理解,则必须将它们写入cerr这样,您就不会混淆读取程序正常输出的第二个程序


  • 你忘了在else箱子周围有一个街区吗

    try
    {
       if (fabs(fTargetValue - fCalculated) <= fTolerance)
         cout << "Result is within range.";
    
       else {
         cout << "Failed.";
         throw calcError;
       }
    
    }
    
    试试看
    {
    
    如果(FAbjs值(fTalk Valf))P>> C++标准有几个例外类都是可导出的。我建议您这样做,而不是抛出和捕获POTS。这并不难,也可以像S/< P/P那样改进(并指定错误类型)。 有关异常层次结构的快速概述,请转到

    问题是:当你抛出一个POD类型时,没有附加的消息。抛出异常的一个重要部分是能够写出一条关于可能出现错误的消息,以及如何修复它。这在抛出int时是不可能的

    C++中有三个输出流:log、cerr和cout。它们的表示方式各不相同,这意味着在启动程序时,可以使用命令行过滤掉其中的每个流。这对于调试非常有用,因为您可以通过cerr进行过滤,并查看程序是否未通过测试

    示例:
    my_program>out.txt 2>log.txt
    (cout转到out.txt,其他转到log.txt)

    但是,我建议不要只使用cerring。通常,catch的作用是反转程序状态!例如,如果您尝试分配一个动态数组,但失败了,则catch将负责在重试之前再次破坏该数组。否则,您将面临一大堆类似内存泄漏之类的问题

    同样需要注意的是,一旦捕获,异常将被“吞没”。如果您不能或不想在此处处理错误,最好编写

    catch(/* Error to be caught */)
    {
        throw; // Rethrows original exception, propagating it upwards
    }
    
    如果你想了解一些关于这方面的好文献,Herb Sutter写了一本书,名为《异常C++
    ,它以一种实用和启发的方式(imo)介绍了异常安全。如果你想知道何时以及为什么需要抛出异常,这本书绝对值得一看


    希望这能有所帮助!

    好吧,这有很多问题。我将尝试给你一些提示:

    (1) 不要在函数中包含try-catch。抛出异常是为了告诉外部世界发生了什么事情
    class CalculationError : std::invalid_argument
    {
    public:
        CalculationError(std::string const& msg)
            : std::invalid_argument(msg)
        {}
    };
    
    catch(/* Error to be caught */)
    {
        throw; // Rethrows original exception, propagating it upwards
    }