自定义异常类 - 为什么需要它?

时间:2014-06-17 09:05:25

标签: c++ exception exception-handling custom-exceptions

我正在阅读有关自定义异常的内容..这就是我所做的。

#include <iostream>
#include <exception>
#include <stdexcept>

using namespace std;

class myBase : public exception
{
public:
    myBase() {};
    virtual ~myBase(void) {};
    virtual const char* what() const { return "Hello, you have done a mistake"; }
};

class myDerived : public myBase
{
public:
    myDerived() {};
    virtual ~myDerived(void) {};
    const char* what() const { return "Hello, you have done a mistake in - derived class"; }
};

int main(void)
{
    try
    {
        throw myDerived();
    }
    catch (exception& e)
    {
        cout << e.what() << endl;
    }

    getchar();
    return 0;
}

我明白了,我可以抛出自定义类对象并捕获它。我不明白这个的目的。有人可以解释我为什么需要自定义异常类?任何实际示例都将帮助我理解使用自定义异常类的目的。

感谢。

2 个答案:

答案 0 :(得分:1)

在c ++中你可以抛出你想要的任何类型,你不需要继承std::exception。 在不同的catch语句中捕获不同类型的能力很有用,因为您可以针对不同的条件抛出不同的异常类型。通过这种方式,您可以正确处理不同的例外情况。

在这个玩具示例中,基于变量one,在catch语句中抛出并处理了不同的异常。 在这种情况下,&#34; string&#34;打印到stdout

#include <iostream>

using namespace std;

int main(void)
{
    int one = 0;
    try
    {
        if(one)
            throw 1;
        else
            throw "string";
    }
    catch (int& i)
    {
        cout << i << endl;
    }
    catch (const char* s)
    {
        cout << s << endl;
    }

    return 0;
}

答案 1 :(得分:1)

让我们说,还有另一个用户定义的class也继承自class myBase

class myDerived2 : public myBase {
public:
    myDerived2() {}
    virtual ~myDerived2() {}
};

并且假设您有一个try catch子句:

try {
  myDerived  A;
  myDerived2 B;
  ...
  /* to staff with both A and B */
  ...
} catch (std::exception& e){
  cout << e.what() << endl; 
}
  • 在上面的try - catch子句中,您通过以相同方式处理myDerivedmyDerived2类型的例外来限制自己。

  • 如果您想以不同的方式处理myDerivedmyDerived2类型的投掷怎么办?

  • 然后你必须定义一个不同的try-catch子句:


try {
  myDerived  A;
  myDerived2 B;
  ...
  /* to staff with both A and B */
  ...
} catch (myDerived &d1) {
  /* treat exception of type myDerived */
} catch (myDerived &d2) {
  /* treat exception of type myDerived2 */
}
  • 从上面的例子我认为很明显,定义自定义异常为程序员提供了一个有价值的多功能工具,可以用更多样化和专业化的方式处理抛出。