Sto usando libjpeg adesso per salvare le immagini JPEG. Se c'è un errore, il comportamento predefinito di libjpeg è chiamare exit()
, che voglio evitare poiché non è un errore fatale per il mio programma. libjpeg allows you to use your own error manager e impone che se si utilizza la propria funzione error_exit()
(che chiama per impostazione predefinita exit()
) deve restituire il controllo al chiamante a. libjpeg suggerisce di utilizzare setjmp.h per soddisfare questo requisito e non il programma exit()
.Lanciare un'eccezione in C++ in un callback C, possibilmente attraversando il limite della libreria dinamica ... è sicuro?
Tuttavia, sto scrivendo un programma C++ e ho accesso alle eccezioni. This question's answer afferma che è sicuro (come nel comportamento ben definito) generare un'eccezione dal callback. Ma non menziona le librerie dinamiche, e c'è una regola generale che non si generano eccezioni attraverso i confini delle librerie dinamiche.
Ecco un esempio:
#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);
}
Quello che vorrei sapere è: posso un'eccezione da questo richiamata, e prendere di nuovo nella mia richiesta, anche se libjpeg è compilato come una libreria dinamica ? libjpeg può essere una libreria statica o dinamica e, se si tratta di una libreria dinamica, potrebbe essere costruita con un compilatore diverso. Tuttavia, il codice che genera e intercetta l'eccezione si troverà sicuramente nella stessa unità di compilazione. Il codice sopra è sicuro?
FYI, sto sviluppando per OS X e Windows (e mantenendo il futuro di una possibilità Linux in mente), quindi sono più interessato a se questo è noto per essere un comportamento ben definito, in generale, e non per una piattaforma/compilatore specifica.
Questo è perfettamente sicuro. Perché non dovrebbe essere? Le chiamate alle librerie condivise utilizzano ancora lo stesso stack di chiamate. –
Questo potrebbe essere correlato: http: // stackoverflow.it/questions/10318363/is-it-safe-per-xs-error-handler-to-exceptions – Pubby
@nw: Non riesco a pensare al motivo per cui non sarebbe stato salvato; Voglio solo assicurarmi che nulla venga spazzato via quando si svolge lo stack. Potrebbe essere perfettamente sicuro, ma sono stato morso nel culo assumendo le cose in passato, quindi sto giocando al sicuro qui e il doppio controllo. – Cornstalks