我的程序调用在发生故障时设置errno
的方法,我抛出errno
就像异常一样抓住它:
try
{
if (-1 == truncate("/foo/bar.txt", 0))
{
throw errno;
}
}
catch (const int errno)
{
//log
}
这里我不想讨论异常处理最佳实践主题。事实是在上面的代码中,当catch括号中的变量名是catch
时,errno
块不会被命中。此问题可简化为:
try
{
throw 1999;
}
catch (const int errno) //renaming "errno" to "e" works!!!
{
//unreachable code here
}
我知道errno
是一个“特殊”名称,但我认为C ++可以正确处理在不同范围内定义的相同变量名。
//test.h
int my_number = 99;
//test.cpp
#include "test.h"
int main()
{
try
{
throw 1999;
}
catch(int my_number)
{
std::cout << "in catch: " << my_number << std::endl; //prints 1999
}
std::cout << my_number << std::endl; //prints 99
}
该程序是在GNU5.4中编译的(在C ++ 11和C ++ 14中都有)。任何人都可以解释这种奇怪的行为吗?
答案 0 :(得分:8)
errno
是一个宏。因此,您的异常处理程序包含一些扩展的标记,这些标记很可能没什么意义。从标准([errno]):
标题的内容与POSIX标题相同 ,除了将errno定义为宏。