我有一套在Win32API和MFC上使用的异常类,它们捕获当前的Win32错误代码(GetLastError()
)并且制定一条关于它发生的位置的人类可读信息。管理参数默认分配的规则是什么?
在ctor开始工作之前,我依赖于捕获当前错误代码的能力,假设在调用ctor之前必须解析ctor的参数。
但是我遇到了当前版本中的问题,在VS2013中将编译工具从120_xp切换到120(我不是100%确定这是更改的来源 - 它可能会暂时搁置一段时间与平台工具集更改无关)。但是,我会认为没有一个是相关的 - 即C++会要求首先解决所有参数,然后执行函数调用,以便下面的默认参数error
始终具有当前的错误代码调用构造函数(这可能会改变它):
这里的调用上下文:
m_file = CreateFile(filename, FILE_GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (!m_file) // NOTE: m_file is smart handle and it's operator bool() knows that the invalid file handle is "false"
throw CWin32APIErrorException(__FUNCTION__, _T("CreateFile"), GetLastError());
如果我改变调用环境迫使当前错误代码捕获,我其实做得到错误2:
m_file = CreateFile(filename, FILE_GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (!m_file)
{
auto error = GetLastError();
throw CWin32APIErrorException(__FUNCTION__, _T("CreateFile"), error);
}
FormatString
简单,它保留了当前的错误代码:
CStringW FormatString(const wchar_t * format, ...)
{
const DWORD dwError = ::GetLastError();
va_list args;
va_start(args, format);
CStringW str;
str.FormatV(format, args);
::SetLastError(dwError);
return str;
}
我遇到的问题是,我看到错误122:缓冲液供应到系统调用太小。但是调用此异常的错误代码是错误2:找不到文件。
我更喜欢我的软件报告“文件未找到”,这是更正确和可操作的。
所以: 1.我错了,C++保证所有参数在函数调用(ctor)被调用之前解决? 2.还能在哪里调用来作出越来越有可能改变当前错误代码(CString的构造函数(S)是唯一的其他东西CWin32APIErrorException::CWin32APIErrorException()
构造函数。
含义是CString的构造函数显然是改变当前错误之前被调用? !唉
有人可以让我知道我错了,在我的理解
谢谢
参数评测的顺序是不确定的,所以是的,CString的构造函数可以让你的方式。 –
谢谢雷蒙德。我刚刚有一个预感 - 事实证明,这是因为我们正在编译unicode - 所以'__FUNCTION__'正在被转换为CString ctor中的一个宽字符串,这引发了一些导致内部错误122的事情。 ( – Mordachai
)这会比较容易修复,因为你将字符串文字传递给了构造函数,所以它不需要'CString'参数,只需使用'LPCTSTR'(使用预处理器将'__FUNCTION__'宏转换为)解决了构造参数时执行任意代码的问题你是否还有其他调用上下文需要传递动态生成的字符串? –