请参阅此代码:
COleDateTime CSpecialEventDlg::GetSpecialEventDate() noexcept
{
COleDateTime datEvent;
if (datEvent.SetDateTime(m_datEvent.GetYear(),
m_datEvent.GetMonth(),
m_datEvent.GetDay(),
0, 0, 0) != 0)
{
// Error
}
return datEvent;
}
我的代码分析说我可以添加noexcept
(我做了)。但我决定再调查一下。我注意到它SetDateTime
返回一个值:
Zero
如果这个COleDateTime
对象的值设置成功;否则,1
。此返回值基于DateTimeStatus
枚举类型。有关详细信息,请参阅SetStatus
成员函数。
对于后一个函数 ( SetStatus
),它声明:
status参数值由
DateTimeStatus
枚举类型定义,该类型在COleDateTime类中定义。详情请参阅COleDateTime::GetStatus
。
现在,文档GetStatus
被记录为具有以下定义:
DateTimeStatus GetStatus() const throw();
因此,如果出现错误,它会引发异常。因此,我决定查看 MFC 源代码SetDateTime
:
inline int COleDateTime::SetDateTime(
_In_ int nYear,
_In_ int nMonth,
_In_ int nDay,
_In_ int nHour,
_In_ int nMin,
_In_ int nSec) throw()
{
SYSTEMTIME st;
::ZeroMemory(&st, sizeof(SYSTEMTIME));
st.wYear = WORD(nYear);
st.wMonth = WORD(nMonth);
st.wDay = WORD(nDay);
st.wHour = WORD(nHour);
st.wMinute = WORD(nMin);
st.wSecond = WORD(nSec);
m_status = ConvertSystemTimeToVariantTime(st) ? valid : invalid;
return m_status;
}
它用于ConvertSystemTimeToVariantTime
设置状态。这使用:
inline BOOL COleDateTime::ConvertSystemTimeToVariantTime(_In_ const SYSTEMTIME& systimeSrc)
{
return AtlConvertSystemTimeToVariantTime(systimeSrc,&m_dt);
}
这使用:
inline BOOL AtlConvertSystemTimeToVariantTime(
_In_ const SYSTEMTIME& systimeSrc,
_Out_ double* pVarDtTm)
{
ATLENSURE(pVarDtTm!=NULL);
//Convert using ::SystemTimeToVariantTime and store the result in pVarDtTm then
//convert variant time back to system time and compare to original system time.
BOOL ok = ::SystemTimeToVariantTime(const_cast<SYSTEMTIME*>(&systimeSrc), pVarDtTm);
SYSTEMTIME sysTime;
::ZeroMemory(&sysTime, sizeof(SYSTEMTIME));
ok = ok && ::VariantTimeToSystemTime(*pVarDtTm, &sysTime);
ok = ok && (systimeSrc.wYear == sysTime.wYear &&
systimeSrc.wMonth == sysTime.wMonth &&
systimeSrc.wDay == sysTime.wDay &&
systimeSrc.wHour == sysTime.wHour &&
systimeSrc.wMinute == sysTime.wMinute &&
systimeSrc.wSecond == sysTime.wSecond);
return ok;
}
在这一点上,我迷路了。简而言之,我假设SetDateTime
不会引发异常。
我明白这一点,如果我决定GetStatus
在子句内部进行调用,if
那么我们确实有可能引发异常。