Почему Matlab `fopen` не выдает исключение?

#matlab #file #exception #fopen

#matlab #файл #исключение #fopen

Вопрос:

Почему fopen не выдает исключение, когда имя файла или путь не существует?

 in_path = 'pqlcnaf8765mlr9f6lf2;

try
    in_file_id = fopen(in_path,'r');
catch 
    error('Problem with input file.')    
end
  

in_path Не существует. Вызов возвращает in_file_id значение -1 , но исключение не генерируется. Кто-нибудь знает почему?

Ответ №1:

Он не предназначен для создания исключения, как указано в документации:

 If fopen cannot open the file, it returns -1.
  

Вам нужно разработать свой код таким образом, чтобы генерировать исключение, которое вы хотите:

 in_path = 'pqlcnaf8765mlr9f6lf2;

in_file_id = fopen(in_path,'r');
if in_file_id == -1
  error('Problem with input file.')    
end
  

Редактировать

Re: Ссылка в 1-м комментарии -> показывает, как обращаться с try catch блоком. Выдает ошибку из-за fread строки. Вы могли бы сделать то же самое в своем коде:

 try
  in_file_id = fopen(in_path,'r');
  fread(in_file_id);
catch 
  error('Problem with input file.')    
end
  

Сказав это, я не думаю, что ссылка является хорошим примером того, как обращаться с несуществующим файлом.

Комментарии:

1. Что насчет этой ссылки: se.mathworks.com/help/matlab/matlab_prog /… . Это меня смутило (и все еще смущает). Спасибо.

2. И еще кое-что. Как мне узнать, предназначена ли функция для выдачи каких-либо ошибок? Например, выдает audioinfo , но где это задокументировано?

3. Большинство ошибок являются ошибками времени выполнения. Помимо этого, написано множество функций, C-style в которых вы получаете код ошибки. Функции предназначены для выдачи только в том случае, если ввод неверен. В коде MATLAB не так много явных бросков. Полную спецификацию можно найти в документе.

4. Итак, fread выдает, но fopen не делает. :-/ И документация для этого по-прежнему остается загадкой.

5. Это, как говорит @patrik, fopen не выдает ошибку, потому что входные данные правильные. Таким образом, вы не создаете ошибку на стороне программирования, но файл не существует, отсюда ошибка в стиле C ( -1 ). fread Выдает ошибку, потому что ввод данных, которые являются -1 (не целым числом), является неправильным вводом, следовательно, ошибка на стороне программирования.