2013-12-04 2 views
0

Я работаю с чужим кодом, и я не знаком с try/catch, поэтому сделал небольшой, похожий пример. В строке 11, если я пишу error(''), он, похоже, не поймает ошибку и не увеличит индекс j. Однако письмо error(' ') или error('bad!') делает.try/catch и ошибка с пустой строкой

Так имеет ли ошибка с пустой строкой игнорировать ошибку, или я делаю что-то неправильно?

% Just a file to understand the Matlab command try/catch 

M = 3; 
j = 1; 
k = [Inf, 5, 4]; 

while M>0 
    try 
     M = M-1 
     u = k(j) 
     if (isinf(u)||isnan(u)), error(''), end; 
    catch 
     j = j+1 
    end 
end 

ответ

3

Да, error('') и error([]) и error(struct([])) все на самом деле не отображают сообщение об ошибке и не работают. Я лично считаю, что использование однострочной аргумента аргумента error будет плохой практикой в ​​любом реальном коде. Вы должны всегда использовать как 'MSGID', так и 'ERRMSG' при написании ошибок для ваших функций, например.

error('FunctionName:SubFunctionName:ErrorMSGID','Error message to be printed.') 

В качестве альтернативы, вы можете использовать MException объекты в конъюнкции с throw, rethrow и throwAsCaller, которые позволяют повторно использовать информацию об ошибках. Подробнее here.

+1

Спасибо! Хорошо иметь подтверждение этого. В документации для ошибки говорится: «Все входные аргументы строки должны быть заключены в одинарные кавычки. Если msgString - пустая строка, команда ошибки не действует». Я должен был искать «ошибку» вместо «try/catch»! Спасибо. :) – Catalina

+0

Откинутый назад, так как я ошибся ... извините. – chappjc

0

, если вы посмотрите на документацию try вы можете иметь пример.

Else хочет вы хотите для вашего Исходного кода:

M = 3; 
j = 1; 
k = [Inf, 5, 4]; 

while M>0 
    try 
     M = M-1 
     u = k(j) 
     if (isinf(u)||isnan(u)), error(''), end; 
    catch 
     disp('I catch an error!'); 
     j = j+1 
    end 
end 

Потому что если вы никогда не получите ошибку в коде, он никогда не будет идти в улове. Поэтому, включив error('');, просто скажите, идите выполнить инструкцию в catch.

Но вы можете просто изменить свой код, заменив error() высказываниями в свой улов, как это:

while M>0 
     M = M-1 
     u = k(j) 
     if (isinf(u)||isnan(u)), j = j+1, end; 
end 

EDIT

Если вы посмотрите в документации, вы можете найдены это:

% ERROR(MSGSTRUCT) reports the error using fields stored in the scalar 
% structure MSGSTRUCT. This structure can contain these fields: 
% 
%  message - Error message string 
%  identifier - See MESSAGE IDENTIFIERS, below 
%  stack  - Struct similar to the output of the DBSTACK function 
% 
% If MSGSTRUCT is an empty structure, no action is taken and ERROR 
% returns without exiting the program. If you do not specify the 
% stack, the ERROR function determines it from the current file and line. 

Так что никаких действий не предпринимается, поскольку вы можете прочитать. И ничего, поэтому уловки не получают никакой информации.

+0

Мой вопрос об использовании ошибки ('') по сравнению с ошибкой ('непустая строка'). Верхний регистр по-прежнему не подходит к catch (для меня), если в ошибке нет непустой строки. Мне было интересно, если стандартная ошибка (''), чтобы ошибки игнорировались. Мне нравится второй пример. Возможно, мне придется отредактировать код, чтобы работать так, но сейчас я пытаюсь понять код, который более сложный, чем мой пример (но похожий). – Catalina

+0

@ Каталина, О! Ты прав. Я никогда не экспериментирую. Потому что, как правило, когда я бросаю ошибку, я использую сообщение или использую его так: 'error();'. Позвольте мне взглянуть на это. Я приду с другим ответом. – Vuwox

1

Это странно, но это в documentation for error, для синтаксиса error('msgString'): Входные аргументы

Все струнные должны быть заключены в одинарные кавычки. Если msgString - пустая строка, команда ошибки не действует.

Аналогично, если используется синтаксис: error(msgStruct)

Если msgStruct пустая структура, никаких действий не предпринимается и возвращается ошибка без выхода из функции.

0

Не знаете, зачем вам это нужно, но вот как это работает.

error Функция не выдает ошибку с пустой строкой или пустым вектором ([]) в качестве аргумента.

Если вы не указали аргумент вообще, то функция error сама генерирует ошибку «Недостаточно аргументов». Так что это пойдёт.

Другой способ - указать пустую структуру в качестве аргумента.

s = struct(); 
error(s) 

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

+1

Это не пустая структура, это структура без полей. Вам нужно сделать 's = struct ([]);' для массива struct 0x0. Тогда это не будет ошибкой. – chappjc

+0

Я думал, что вопрос заключается в том, чтобы выбросить ошибку, но не имеет выхода. Это именно то, что делает 'error (struct()). 'error (struct ([]))' не будет вызывать ошибку, такую ​​же, как 'error ('')'. – yuk

+0

О, я думаю, что OP было просто любопытно, почему 'error ('')' не выдавала ошибку, поэтому дискуссии о пустых структурах одинаковы. Но, поскольку вы указываете на это, я бы сказал, что у вас есть хороший способ отключить ошибку без сообщения. :) – chappjc

Смежные вопросы