我的代码有一个小问题。由于某种原因,当我尝试使用下面的代码抛出字符串时,我在 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;
}
}
错误:
扔一根绳子确实是个坏主意。
在你的代码中你抛出了一个
const char*
。抛出内置类型(如本例中的 int
、float
或 const char*
)是一个坏主意,因为这些内置类型不携带正确的上下文错误信息。事实上,当捕获异常时,了解异常的“原因”以采取适当的操作非常重要。但是内置类型无法正确提供此类信息,使得捕获站点很难理解异常的reason和cause。
此外,抛出内置类型也令人困惑,因为它不是现代 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
}
const char*
,而不是
std::string
,相反,您应该扔 string("error")
编辑:错误已解决
throw string("exception ! error");