2011-01-19 9 views
12

Ad esempio, voglio catturare un'eccezione couldn't-read-a-file-at-that-path da imread(). Posso farlo.C'è qualche riferimento autorevole su quali eccezioni possono essere lanciate dalle funzioni built-in di Matlab?

imagePath = 'a_picture.jpg'; 
try 
    im = imread(imagePath); 
catch exception 
    if strcmp(exception.identifier, 'MATLAB:imread:fileOpen') 
     fprintf('Couldn''t open %s.\n', imagePath); 
     im = []; 
    else 
     fprintf('Unexpected error (%s): %s\n', ... 
       exception.identifier, exception.message); 
     throw(exception); 
    end 
end 

Ma gli unici modi che conosco per scoprire la stringa magica da confrontare con ('MATLAB: imread: FileOpen' in questo caso), sono:

  1. Causa l'errore, intercettare l'eccezione e guarda l'identificatore. Ma ci vorrebbe molto tempo per farlo correttamente. Ad esempio, Matlab usa un identificatore di eccezione diverso se il file esiste ma non è effettivamente un file immagine? Che ne dici se esiste ma non ho il permesso di lettura? Cosa succede se si tratta di una directory?

  2. Controllare il codice sorgente. imread() è scritto in Matlab, quindi questo è possibile, ma non lo sarebbe per altre funzioni. E naturalmente imread() chiama le altre altre funzioni che non sono scritte in Matlab, e potrebbero nascere eccezioni da esse.

Esiste un modo autorevole per farmi conoscere tutte le eccezioni che imread() può lanciare? Spero che questo sia nella documentazione da qualche parte, ma non riesco a trovarlo.

+1

Possibile duplicato: [MATLAB: un riferimento ai messaggi di errore] (http://stackoverflow.com/questions/4562698/matlab-a-reference-about-error-messages) – gnovice

+0

Perché è importante che venga emessa un'eccezione? Ha funzionato o no, giusto? – MatlabDoug

+0

Una domanda migliore: perché è necessario identificare l'errore con una tale specificità, quando tutto ciò che si sta facendo realmente lo sta ripensando? – gnovice

risposta

0

Io cerco quello, e non ho trovato nulla ... L'unica cosa che vedo potrebbe aiutarti, sarebbe analizzare il codice sorgente di imread, che non credo sia possibile. Tuttavia, si può sempre provare a vedere il codice sorgente della stessa funzione in Octave, poiché è quasi lo stesso (suppongo).

0

Se siete disposti a enumerare i file per generare il proprio riferimento, provare

grep -r "MATLAB:" <matlab root> 

si otterrà una lista lunga ... ma sembra errori o sono gettati da error() o mexErrMsgIdAndTxt. Questi più nomi di funzioni ti consentono di essere più specifico. Comunque abbastanza lento.

grep noterà anche che alcuni file binari corrispondono. Feed it -a e sarà in grado di estrarre i messaggi di errore da molti di loro.

1

No, non c'è.

Il problema è che anche se ci fosse un riferimento autorevole su ciò che una data funzione in MatLab genera, potrebbe cambiare da versione a versione. Quindi, anche se tu potessi farlo, probabilmente non dovresti farlo.

Si consiglia di controllare solo quelli che sai essere in grado di gestire e generare alcuni errori generici per altri (o riutilizzare ciò che MatLab fornisce).


Alcuni commenti sulla base di altre lingue/quadri:

In .NET, l'unica lista di eccezioni che può essere gettato da un metodo, è nella documentazione, e non è stato utile al codice sorgente. Questi sono spesso obsoleti, non validi e incompleti.

In Java, è possibile specificare quale eccezione viene generata da quale metodo. Questo viene quindi verificato dal compilatore e pertanto il compilatore può creare un riferimento autorevole.MatLab non ha questa caratteristica, quindi la cosa migliore che puoi fare è cercare come delineato in altre risposte.

Problemi correlati