1

我可以做这样的东西吗?

#define N_VALID "is not a valid ID"  
...  
throw N_valid;  
...  
catch(char *message){  
fprintf(stderr,"%s",message);}  
4

5 回答 5

4

是的,除了你扔的是一个const char *,而不是一个char *https ://ideone.com/UsnitG

#include <iostream>
using std::cout; using std::endl;

#define N_VALID "is not a valid ID"

void function_throws()
{
  throw N_VALID;
}

int main()
{
    try
    {
        function_throws();
    }
    catch(const char *message) // <= Note the const here!
    {
        cout << message << endl;
    }
}

但是,乔尔是正确的,您应该避免这样做。如果您真的想在此处使用宏,请尝试将其用作 std::exception 对象的参数:https ://ideone.com/Dsx1RF

void function_throws()
{
  throw invalid_argument(N_VALID);
}

int main()
{
    try
    {
        function_throws();
    }
    catch(const invalid_argument& ex)
    {
        cout << "invalid_argument: " << ex.what() << endl;
    }
}
于 2013-05-21T17:07:02.597 回答
1

是的。

#define N_VALID "is not a valid ID" 

throw N_VALID;
throw "is not a valid ID";

一旦预处理完成,上面的底部两行在编译器的眼中实际上是相同的。

于 2013-05-21T17:05:24.433 回答
0

这是合法但不道德的。您应该始终抛出一个对象,以便您的客户可以单独处理您的错误,而不是在一次捕获中使用巨大的 if 语句。

于 2013-05-21T17:05:01.207 回答
0

#define 指令通过在编译应用程序之前用代码中的另一个标签替换一个标签来工​​作。因此,如果你能做到这一点:

throw "is not a valid ID";

你可以这样做:

throw N_VALID;
于 2013-05-21T17:05:39.730 回答
0

它应该工作。请记住,预处理器在编译器之前运行,并将 N_VALID 替换为“不是有效 ID”

于 2013-05-21T17:10:36.187 回答