Main Content

MException

오류 정보 캡처

설명

오류를 감지하고 예외를 발생시키는 모든 MATLAB® 코드는 MException 객체를 생성합니다. MException 객체는 오류에 대해 가져올 수 있는 정보를 포함합니다. MATLAB은 미리 정의된 예외나 미리 생성해 둔 예외를 발생시킬 수 있습니다.

생성

설명

예제

ME = MException(errID,msg)는 특정 오류에 대한 정보를 캡처해서 MException 객체 ME에 저장합니다. MException 객체는 오류 ID errID와 오류 메시지 msg를 사용하여 생성됩니다.

예제

ME = MException(errID,msg,A1,...,An)을 사용하면 텍스트나 숫자형 값 A1,...,An을 사용하여 오류 메시지의 형식을 지정할 수 있으며, 런타임에 msg의 변환 지정자를 대체할 수 있습니다.

입력 인수

모두 확장

오류 ID로, 문자형 벡터 또는 string형 스칼라로 지정됩니다. 예외 처리에 오류 ID를 사용하여 오류의 원인을 보다 효율적으로 식별하거나 프로그램에서 선택한 예외 서브셋을 제어할 수 있습니다.

오류 ID는 하나 이상의 컴포넌트 필드와 하나의 니모닉 필드를 포함합니다. 필드는 콜론으로 구분되어야 합니다. 예를 들어, 컴포넌트 필드 component와 니모닉 필드 mnemonic을 갖는 오류 ID는 'component:mnemonic'으로 지정됩니다.

  • 컴포넌트 필드는 일반적으로 다양한 오류가 발생할 수 있는 제품 또는 기능을 지정합니다. 예를 들어, 오류 ID 'MATLAB:TooManyInputs'는 컴포넌트 필드 MATLAB을 갖습니다. 이는 예외가 MATLAB에서 발생됨을 의미합니다. 앞에 다른 컴포넌트를 지정하기만 하면 동일한 니모닉 TooManyInputs를 사용할 수 있습니다. 예를 들어, 함수가 너무 많은 입력값과 함께 호출될 때마다 툴박스에서 오류를 발생시키려면 'MyToolbox:TooManyInputs'를 사용할 수 있습니다.

  • 오류 ID의 니모닉 필드는 보통 해당 오류 문제에만 적용되는 태그입니다. 예를 들어, MATLAB에서 모호한 구문을 사용하여 발생한 오류를 보고할 때는 오류 ID를 'MATLAB:ambiguousSyntax'로 지정할 수 있습니다.

컴포넌트 필드와 니모닉 필드는 각각 영문자로 시작해야 합니다. 나머지 문자는 영숫자(A–Z, a–z, 0–9)나 밑줄일 수 있습니다. errID에는 공백 문자를 사용할 수 없습니다.

예: 'MyComponent:noSuchVariable'

예: 'Simulink:Signals:InvalidNumberOfPorts'

오류 원인과 오류를 해결할 수 있는 방법에 대한 정보로, 문자형 벡터나 string형 스칼라로 지정됩니다. 텍스트의 형식을 지정하려면 \t, \n 등의 이스케이프 시퀀스를 사용하십시오. sprintf 함수가 지원하는 형식 지정자(예: %s 또는 %d)를 사용할 수도 있습니다. A 입력 인수를 사용하여 변환 지정자의 값을 지정합니다.

예: 'Error opening file.'

예: 'Error on line %d.'

msg의 변환 지정자를 대체하는 하나 이상의 값으로, 각 값은 문자형 벡터, string형 스칼라 또는 숫자형 스칼라로 지정됩니다.

속성

모두 확장

읽기 전용 속성입니다.

오류를 고유하게 식별하는 문자형 벡터로, 입력 인수 errID의 문자형 벡터로부터 지정됩니다.

예: 'MATLAB:test'

읽기 전용 속성입니다.

MATLAB이 예외를 발생시킬 때 표시하는 오류 메시지가 담긴 문자형 벡터로, msgA 입력 인수로 지정됩니다.

예: 'Variable x not found'

읽기 전용 속성입니다.

MATLAB이 예외를 발생시키는 파일 이름(file), 함수 이름(name), 라인 번호(line)를 포함한 스택 추적 정보가 포함된 구조체형 배열입니다. 호출된 함수에서 오류가 발생할 경우 stack 속성에는 호출된 각 함수에 대해 파일 이름, 함수 이름, 라인 번호가 포함됩니다. MATLAB은 예외를 발생시킬 때만 스택을 생성합니다.

stack은 N×1 struct 배열입니다. 여기서 N은 호출 스택의 깊이를 나타냅니다.

읽기 전용 속성입니다.

MATLAB에 예외를 발생시킨 원인이 되는 MException 객체로 구성된 셀형 배열입니다. cause 속성에 예외를 추가하려면 addCause 메서드를 사용하십시오.

읽기 전용 속성입니다.

예외에 대한 제안 수정 사항으로, matlab.lang.correction.AppendArgumentsCorrection, matlab.lang.correction.ConvertToFunctionNotationCorrection 또는 matlab.lang.correction.ReplaceIdentifierCorrection 객체로 지정됩니다. 발생된 예외가 포착되지 않은 경우 MATLAB은 Correction 속성을 사용하여 이 예외에 대한 수정 사항을 제안합니다.

객체 함수

throw예외 발생
MException.last가장 최근 uncaught exception 반환
rethrow이전 caught exception 다시 발생
throwAsCaller호출하는 함수 내에서 발생하는 것처럼 예외 발생시키기
addCause예외의 추가적인 원인 기록
addCorrectionProvide suggested fix for exception
getReport예외(Exception)에 대한 오류 메시지 가져오기

예제

모두 축소

입력 오류에 대한 정보를 캡처하는 MException 객체를 만듭니다.

errID = 'myComponent:inputError';
msgtext = 'Input does not have the expected format.';

ME = MException(errID,msgtext)
ME = 
  MException with properties:

    identifier: 'myComponent:inputError'
       message: 'Input does not have the expected format.'
         cause: {}
         stack: [0x1 struct]
    Correction: []

msgtext 입력 인수와 A1,...,An 입력 인수를 모두 사용하여 오류 메시지를 만듭니다.

errID = 'MATLAB:test';
msgtext = 'There are %d errors on this page';
A1 = 10;

ME = MException(errID,msgtext,A1)
ME = 
  MException with properties:

    identifier: 'MATLAB:test'
       message: 'There are 10 errors on this page'
         cause: {}
         stack: [0x1 struct]
    Correction: []

입력 변수 이름이 작업 공간에 존재하지 않으면 예외를 발생시킵니다.

str = input('Type a variable name: ','s');
if ~exist(str,'var')
    ME = MException('MyComponent:noSuchVariable', ...
        'Variable %s not found',str);
    throw(ME)
end

입력 프롬프트에서 작업 공간에 존재하지 않는 변수를 입력합니다. 예를 들어, notaVariable을 입력합니다.

Variable notaVariable not found

notVariable은 작업 공간에 없으므로, MATLAB은 MException 객체를 생성하고 예외를 발생시킵니다.

try, catch를 사용하여 MException 객체에 캡처된 정보에 액세스합니다.

입력값 없는 surf 함수 호출이 포함된 파일 myfile.m을 만듭니다. (이 함수 호출의 결과로 예외가 발생하는데, 이는 설명을 위해 일부러 그런 것입니다.) MATLAB이 MException 객체 ME로 발생시킨 예외를 포착하고, MEmessage 속성에 액세스하여 오류 메시지를 표시합니다.

try
    surf
catch ME
    disp('Error Message:')
    disp(ME.message)
end
Error Message:
Not enough input arguments.

오류 ID를 추출합니다.

ME.identifier
ans =

    'MATLAB:narginchk:notEnoughInputs'

stack 속성의 내용을 쿼리합니다. 이 예제에서 호출 스택은 2×1 구조체형 배열로 표현됩니다.

for i = 1:numel(ME.stack)
    ME.stack(i)
end
ans = 

  struct with fields:

    file: 'matlabroot\toolbox\matlab\graph3d\surf.m'
    name: 'surf'
    line: 49


ans = 

  struct with fields:

    file: 'c:\myMATLABfiles\myfile.m'
    name: 'myfile'
    line: 2

stack의 첫 번째 요소는 파일 이름(surf.m), 함수 이름(surf), 그리고 예외가 발생한 라인 번호(49)를 표시합니다. stack의 두 번째 요소는 호출자 스크립트에서 예외가 발생한 라인 번호와 이름을 표시합니다.

존재하지 않는 함수 notaFunction을 호출하여 생성된 예외를 포착합니다. 함수가 정의되어 있지 않으면 경고를 발생시키고 출력값에 값 0을 할당합니다.

try
    a = notaFunction(5,6);
catch ME
    if strcmp(ME.identifier,'MATLAB:UndefinedFunction')
        warning('Function is undefined.  Assigning a value of 0.');
    else
        rethrow(ME)
    end
end
Warning: Function is undefined.  Assigning a value of 0. 

notaFunction을 호출하면 그 자체로 오류가 발생합니다. 이 코드는 trycatch를 사용하여 정의되지 않은 함수 예외를 포착하고 이를 경고로 다시 패키징하여 MATLAB이 다음 명령을 계속 실행할 수 있게 해 줍니다. caught exception이 다른 오류 ID를 갖는 경우 MATLAB은 예외를 다시 발생시킵니다.

확장 기능

버전 내역

R2007b에 개발됨