मैं जेपीईजी छवियों को सहेजने के लिए अभी libjpeg का उपयोग कर रहा हूं। अगर कोई त्रुटि है, तो libjpeg का डिफ़ॉल्ट व्यवहार exit()
पर कॉल करना है, जिसे मैं टालना चाहता हूं क्योंकि यह मेरे प्रोग्राम के लिए घातक त्रुटि नहीं है। libjpeg allows you to use your own error manager, और यह आदेश देता है कि यदि आप अपने error_exit()
फ़ंक्शन का उपयोग करते हैं (जो डिफ़ॉल्ट रूप से exit()
पर कॉल करता है) तो आप कॉलर पर नियंत्रण वापस नहीं कर सकते हैं। libjpeg इस आवश्यकता को पूरा करने के लिए setjmp.h का उपयोग करने का सुझाव देता है और exit()
प्रोग्राम नहीं।सी कॉलबैक में सी ++ में अपवाद फेंकना, संभवतः गतिशील लाइब्रेरी सीमा पार करना ... क्या यह सुरक्षित है?
हालांकि, मैं एक सी ++ प्रोग्राम लिख रहा हूं, और मेरे पास अपवादों तक पहुंच है। This question's answer कॉलबैक से अपवाद फेंकने के लिए यह सुरक्षित है (जैसा कि अच्छी तरह से परिभाषित व्यवहार में है)। लेकिन इसमें गतिशील पुस्तकालयों का उल्लेख नहीं है, और अंगूठे का एक सामान्य नियम है कि आप गतिशील पुस्तकालय सीमाओं में अपवाद नहीं फेंकते हैं।
#include <iostream>
#include <jpeglib.h>
#include <cstdio>
#include <stdexcept>
static void handleLibJpegFatalError(j_common_ptr cinfo)
{
(*cinfo->err->output_message)(cinfo);
throw std::runtime_error("error in libjpeg, check stderr");
}
int main()
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE* file = std::fopen("out.jpeg", "wb"); // assume this doesn't fail for this example
try
{
cinfo.err = jpeg_std_error(&jerr);
jerr.error_exit = handleLibJpegFatalError;
// let's say this triggers a fatal error in libjpeg and handleLibJpegFatalError() is called
// by libjpeg
jpeg_create_compress(&cinfo);
}
catch (...)
{
std::cerr << "Error saving the JPEG!\n";
}
jpeg_destroy_compress(&cinfo);
std::fclose(file);
}
मुझे पता है कि क्या करना चाहेंगे है:
यहाँ एक उदाहरण है, भले ही libjpeg एक गतिशील पुस्तकालय के रूप में संकलित किया गया है मैं इस कॉलबैक से एक अपवाद फेंक, और अपने आवेदन में इसे वापस पकड़ कर सकते हैं, ? libjpeg एक स्थैतिक या गतिशील पुस्तकालय हो सकता है, और यदि यह एक गतिशील पुस्तकालय है तो यह संभवतः एक अलग कंपाइलर के साथ बनाया जा सकता है। हालांकि, जो कोड फेंकता है और अपवाद को पकड़ता है वह निश्चित रूप से एक ही संकलन इकाई में होगा। उपरोक्त कोड सुरक्षित है?
FYI करें, मैं ओएस एक्स और Windows के लिए विकसित कर रहा हूँ (और मन में एक लिनक्स संभावना के भविष्य रखने), तो मैं अधिक इच्छुक हूँ में यह सामान्य रूप में अच्छी तरह से परिभाषित व्यवहार, और नहीं माना जाता है, तो एक विशिष्ट मंच/कंपाइलर के लिए।
यह पूरी तरह से सुरक्षित है। ऐसा क्यों नहीं होगा? साझा लाइब्रेरी कॉल अभी भी एक ही कॉल स्टैक का उपयोग करते हैं। –
यह संबंधित हो सकता है: http: // stackoverflow।कॉम/प्रश्न/10318363/यह-सुरक्षित-के-एक्स-त्रुटि-हैंडलर-टू-फेंक-अपवाद – Pubby
@nw: मैं नहीं सोच सकता कि यह क्यों बचाया नहीं जाएगा; मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि ढेर को अनदेखा करते समय कुछ भी ट्रैश नहीं होगा। यह पूरी तरह से सुरक्षित हो सकता है, लेकिन मुझे अतीत में चीजों को मानकर बट में काट दिया गया है, इसलिए मैं इसे यहां सुरक्षित और डबल चेकिंग कर रहा हूं। – Cornstalks