C++ 异常 - 抛出字符串

问题描述 投票:0回答:4

我的代码有一个小问题。由于某种原因,当我尝试使用下面的代码抛出字符串时,我在 Visual Studio 中收到错误。

#include <string>
#include <iostream>
using namespace std;

int main()
{
    
    char input;

    cout << "\n\nWould you like to input? (y/n): ";
    cin >> input;
    input = tolower(input);

    try
    {
        if (input != 'y')
        {
            throw ("exception ! error");
        }
    }
    catch (string e)
    {
        cout << e << endl;
    }
}

错误:

error

c++ exception error-handling
4个回答
25
投票

扔一根绳子确实是个坏主意。

在你的代码中你抛出了一个

const char*
。抛出内置类型(如本例中的
int
float
const char*
)是一个坏主意,因为这些内置类型不携带正确的上下文错误信息。事实上,当捕获异常时,了解异常的“原因”以采取适当的操作非常重要。但是内置类型无法正确提供此类信息,使得捕获站点很难理解异常的reasoncause 此外,抛出内置类型也令人困惑,因为它不是现代 C++ 惯用的。抛出异常的惯用 C++ 方法是定义一个

适当的 C++ 类

来表示异常,通常从 std::exception 派生它,或者从

std::exception
派生的其他类,然后
throw
此类的实例异常类。 您还可以简单地抛出一些已在 C++ 标准库中定义的 C++ 异常类,例如
std::runtime_error
例如,您可以抛出一个

std::runtime_error

,将错误消息字符串传递给构造函数,如下所示:

throw std::runtime_error("Your error message");

并且,在 catch 站点,您可以通过 const 引用 (
runtime_error

) 捕获

const &
异常,并调用
what()
方法来获取错误字符串。
try {
    ...
} catch (const std::runtime_error& ex) {
    // Invoke ex.what() to get the error message
}

但是
不要

扔“裸”绳子。

如果您想定义
自定义异常类

,您可以从std::runtime_error派生它,如下所示:

class YourCustomException
    : public std::runtime_error 
{
  public:

    YourCustomException(const char* message)
        : std::runtime_error(message) {
    }

    YourCustomException(const std::string& message)
        : std::runtime_error(message) {
    }
};

像这样扔:

throw YourCustomException("Your error message");

然后像这样抓住它:

try { ... } catch (const YourCustomException& ex) { // Invoke ex.what() to get the error message }



24
投票
const char*

,而不是

std::string
,相反,您应该扔
string("error")
编辑:错误已解决

throw string("exception ! error");



3
投票


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.