Andrei Alexandrescu在最後的C++ and Beyond regarding systematic error handling舉行了一次演講。 我喜歡Expected模板模式並將其調整爲Visual Studio 2010,因爲編譯器目前不支持擴展聯合。所以我寫了一個UnitTest來檢查一切正常。然後我發現我想檢查分片異常的檢測是否有效。但事實並非如此。是否有可能檢測到按值捕獲異常切片?
我不想讓我試着減少它點到這裏粘貼完整代碼:
#include <iostream>
#include <string>
#include <exception>
#include <typeinfo>
class MyException : public std::exception
{
public:
MyException()
: std::exception()
{}
virtual const char* what() const { return "I come from MyException"; }
};
void hereHappensTheFailure()
{
throw MyException();
}
template <class E>
void detector(const E& exception)
{
if (typeid(exception) != typeid(E))
{
std::cout << "Exception was sliced" << std::endl;
}
else
{
std::cout << "Exception was not sliced" << std::endl;
}
}
int main()
{
try
{
hereHappensTheFailure();
}
catch (std::exception ex) // intentionally catch by value to provoke the problem
{
detector(ex);
}
return 0;
}
但沒有檢測到切片。所以我在測試中遇到了錯誤,這是不是VS2010的工作原理,或者模式最終不起作用? (剛剛編輯,因爲gcc 4.7.2上ideone不喜歡) 非常感謝提前!
你試圖做的事是非法的:'std :: exception'是抽象的,因此你不能切片。即使那樣,一旦你切割了一個物體,除非你有某種參考,否則通常不可能知道其來源。 –
@NathanErnst - 'std :: exception'不是抽象的。 –
@PeteBecker,我的不好。我忘了沒有辦法指定什麼'()'沒有繼承就返回。 –