2011-01-19 2 views
12

Par exemple, je veux capturer une exception couldn't-read-a-file-at-that-path de imread(). Je peux le faire.Existe-t-il des références faisant autorité sur les exceptions pouvant être générées par les fonctions intégrées de 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 

Mais les seuls moyens que je connais de découvrir la chaîne magique pour comparer avec ('Matlab: imread: fileOpen' dans ce cas), sont les suivants:

  1. cause l'erreur, attraper l'exception et regardez l'identifiant. Mais il faudrait beaucoup de temps pour le faire correctement. Par exemple, Matlab utilise-t-il un identificateur d'exception différent si le fichier existe mais n'est pas réellement un fichier image? Que diriez-vous si cela existe mais je n'ai pas la permission de lire? Et si c'est un répertoire?

  2. Regardez le code source. imread() est écrit en Matlab, donc c'est possible, mais ce ne serait pas pour d'autres fonctions. Et bien sûr, imread() appelle autres fonctions qui ne sont pas écrites dans Matlab, et des exceptions peuvent surgir d'elles.

Y a-t-il un moyen autoritaire pour moi de connaître toutes les exceptions que imread() peut lancer? J'espère que c'est dans la documentation quelque part, mais je ne peux pas le trouver.

+1

Copie possible: [MATLAB: référence sur les messages d'erreur] (http://stackoverflow.com/questions/4562698/matlab-a-reference-about-error-messages) – gnovice

+0

Pourquoi l'exception est-elle générée? Cela a fonctionné ou non, n'est-ce pas? – MatlabDoug

+0

Une meilleure question: pourquoi avez-vous besoin d'identifier l'erreur avec une telle spécificité, alors que tout ce que vous faites vraiment avec elle est effectivement de le repenser? – gnovice

Répondre

0

Je recherche pour cela, et je n'ai rien trouvé ... La seule chose que je vois pourrait vous aider, serait d'analyser le code source de imread, ce que je ne pense pas que ce soit possible. Cependant, vous pouvez toujours essayer de voir le code source de la même fonction dans Octave, car il est presque le même (je suppose).

0

Si vous êtes prêt à énumérer les fichiers pour générer votre propre référence, essayez

grep -r "MATLAB:" <matlab root> 

vous obtiendrez une longue liste ... mais il semble erreurs sont soit jetés par error() ou mexErrMsgIdAndTxt. Ces noms de fonctions plus vous permettent d'être plus précis. Assez lent cependant.

grep Notez également que certains fichiers binaires correspondent. Feed it -a et il sera capable de sortir les messages d'erreur de beaucoup d'entre eux.

1

Non, il n'y en a pas. Le problème est que, même s'il existe une référence faisant autorité sur ce qu'une fonction donnée dans MatLab lance, elle peut changer d'une version à l'autre. Donc, même si vous pouviez le faire, vous ne devriez probablement pas.

Je vous recommande de ne vérifier que ceux que vous savez manipuler et de générer des erreurs génériques pour les autres (ou de réutiliser ce que MatLab vous donne).


Quelques commentaires basés sur d'autres langues/cadres:

Dans .NET, la seule liste des exceptions qui peuvent être projetés à partir d'une méthode, est dans la documentation et n'est pas aimé au code source. Ceux-ci sont souvent périmés, invalides et incomplets.

En Java, vous pouvez spécifier quelle exception est levée à l'aide de quelle méthode. Ceci est ensuite vérifié par le compilateur, et par conséquent une référence faisant autorité peut être construite par le compilateur.MatLab manque d'une telle fonctionnalité, donc le mieux que vous puissiez faire est de chercher comme indiqué dans d'autres réponses.

Questions connexes