कुछ लेख समापन "कभी नहीं एक नाशक से एक अपवाद फेंक", और "std :: uncaught_exception() उपयोगी नहीं है" उदाहरण के लिए, कर रहे हैं:सही उपयोग
- http://www.gotw.ca/gotw/047.htm (हर्ब Sutter द्वारा लिखित)
लेकिन ऐसा लगता है कि मैं बात नहीं मिल रहा है। तो मैंने एक छोटा परीक्षण उदाहरण लिखा (नीचे देखें)।
चूंकि सब कुछ परीक्षण उदाहरण के साथ ठीक है क्योंकि मैं इसके बारे में कुछ गलत कहने के बारे में कुछ टिप्पणियों की सराहना करता हूं?
परीक्षण के परिणामों:
./main
Foo::~Foo(): caught exception - but have pending exception - ignoring int main(int, char**): caught exception: from int Foo::bar(int)
./main 1
Foo::~Foo(): caught exception - but *no* exception is pending - rethrowing int main(int, char**): caught exception: from Foo::~Foo()
उदाहरण:
// file main.cpp
// build with e.g. "make main"
// tested successfully on Ubuntu-Karmic with g++ v4.4.1
#include <iostream>
class Foo {
public:
int bar(int i) {
if (0 == i)
throw(std::string("from ") + __PRETTY_FUNCTION__);
else
return i+1;
}
~Foo() {
bool exc_pending=std::uncaught_exception();
try {
bar(0);
} catch (const std::string &e) {
// ensure that no new exception has been created in the meantime
if (std::uncaught_exception()) exc_pending = true;
if (exc_pending) {
std::cerr << __PRETTY_FUNCTION__
<< ": caught exception - but have pending exception - ignoring"
<< std::endl;
} else {
std::cerr << __PRETTY_FUNCTION__
<< ": caught exception - but *no* exception is pending - rethrowing"
<< std::endl;
throw(std::string("from ") + __PRETTY_FUNCTION__);
}
}
}
};
int main(int argc, char** argv) {
try {
Foo f;
// will throw an exception in Foo::bar() if no arguments given. Otherwise
// an exception from Foo::~Foo() is thrown.
f.bar(argc-1);
} catch (const std::string &e) {
std::cerr << __PRETTY_FUNCTION__ << ": caught exception: " << e << std::endl;
}
return 0;
}
जोड़ा : दूसरे शब्दों में: कुछ लेखों में चेतावनियों के बावजूद यह अपेक्षित काम करता है - तो इसमें क्या गलत हो सकता है?
आपका प्रश्न क्या है? आप एक तंत्र के अपेक्षित व्यवहार को देख रहे हैं जिसका आपको उपयोग नहीं करना चाहिए। क्या आप परीक्षण/प्रयोग संदर्भ के बाहर इसका उपयोग करने पर विचार कर रहे हैं, और क्यों? – Potatoswatter
@Potatoswatter: सवाल यह है: 'कुछ लेखों में चेतावनियों के बावजूद यह अपेक्षित काम करता है - तो इसके साथ क्या गलत हो सकता है?' –
फेयर नफ, लेकिन यह आपके द्वारा जो कहा गया है उसे उद्धृत नहीं कर रहा है, और यह जानना असंभव है कि क्या अपेक्षित है, अधिक जानकारी के बिना अपने संदर्भ में उपयुक्त, या सुरक्षित। सुरक्षित मार्ग, जैसे हर्ब सटर और कई अन्य आपको बताएंगे, पहले स्थान पर विनाशक से फेंकना नहीं है। – Potatoswatter