Подтвердить что ты не робот

Есть ли авторитетная ссылка на то, какие исключения могут быть выбраны встроенными функциями Matlab?

Например, я хочу поймать исключение cann't-read-a-file-at-this-path из imread(). Я могу это сделать.

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

Но единственные способы, с помощью которых я знаю, найти магическую строку для сравнения с ( "MATLAB: imread: fileOpen" в этом случае):

  • Выясните ошибку, поймайте исключение и посмотрите на идентификатор. Но это займет много времени. Например, использует ли Matlab другой идентификатор исключения, если файл существует, но на самом деле не является файлом изображения? Как насчет того, существует ли он, но у меня нет разрешения на чтение? Что, если это каталог?

  • Посмотрите на исходный код. imread() написано в Matlab, так что это возможно, но это не относится к другим функциям. И, конечно, imread() вызывает другие функции, которые не написаны в Matlab, и из них могут возникнуть исключения.

Есть ли какой-либо авторитетный способ узнать все исключения, которые imread() может выбросить? Я надеюсь, что это где-то в документации, но я не могу найти его.

4b9b3361

Ответ 1

Нет, нет.

Проблема в том, что даже если бы была авторитарная ссылка на то, что заданная функция в металибрах бросает, она может измениться с версии на версию. Поэтому, даже если вы можете это сделать, вы, вероятно, не должны.

Я бы рекомендовал только проверять те, которые, как вы знаете, вы можете обрабатывать, и генерировать некоторые общие ошибки для других (или повторно использовать то, что дает MatLab).


Некоторые комментарии на основе других языков/фреймворков:

В .NET единственный список исключений, которые могут быть выбраны из метода, содержится в документации и не нравится исходному коду. Они часто устарели, недействительны и неполны.

В Java вы можете указать, какое исключение выбрано для какого-либо метода. Это затем проверяется компилятором, и поэтому компилятор может создать авторитетную ссылку. MatLab не хватает такой функции, поэтому лучше всего вы можете искать, как описано в других ответах.

Ответ 2

Я искал это, и я ничего не нашел... Единственное, что я вижу, это может помочь вам, будет анализировать исходный код imread, который я не думаю, что это возможно. Тем не менее, вы всегда можете попытаться увидеть исходный код той же функции в Octave, так как он почти тот же (я полагаю).

Ответ 3

Если вы хотите перечислить файлы для создания своей собственной ссылки, попробуйте

grep -r "MATLAB:" <matlab root>

вы получите длинный список... но кажется, что ошибки выбрасываются error() или mexErrMsgIdAndTxt. Эти плюсовые имена функций позволяют вам быть более конкретными. Довольно медленно, хотя.

grep также заметит, что некоторые бинарные файлы совпадают. Подайте его -a, и он сможет вытащить сообщения об ошибках из многих из них.