이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

예외에 대한 정보 캡처하기

개요

MATLAB®은 예외를 발생시킬 때, 예외의 원인에 대한 정보를 MException 객체라는 데이터 구조에 담습니다. 이 객체는 MATLAB MException 클래스의 인스턴스입니다. 프로그램이 중단되기 전에 예외를 포착하고 catch 명령을 통해 이 특정 오류에 대해 생성된 객체에 액세스하는 방식으로 MException 객체에 액세스할 수 있습니다. 직접 작성한 코드의 오류에 대해 예외를 발생시키는 경우에는 새 MException 객체를 만든 다음 오류에 대한 정보를 이 객체에 저장해야 합니다.

이 섹션에서는 MException 클래스와 이 클래스에서 생성된 객체에 대해 설명합니다.

이 클래스를 사용하는 방법에 대한 정보는 뒷부분에 나오는 예외에 대한 대응책 섹션과 예외 발생시키기 섹션에 설명되어 있습니다.

MException 클래스

아래 표시된 그림에서는 MException 클래스의 객체가 취할 수 있는 하나의 구성을 보여줍니다. 이 객체에는 identifier, message, stack, cause, Correction의 5가지 속성이 있습니다. 이러한 속성은 각각 MException 객체를 나타내는 구조체의 필드로 구현됩니다. stack 필드는 각각 함수를 식별하는 추가 구조체와 호출 스택의 라인 번호로 구성된 Nx1 배열입니다. cause 필드는 각각 현재 객체와 관련된 예외를 나타내는 MException 객체로 구성된 Mx1 셀형 배열입니다.

이러한 속성에 대한 전체 설명은 MException 클래스의 속성 항목을 참조하십시오.

객체 생성자

오류를 감지하고 예외를 발생시키는 코드는 그 오류에 대한 정보를 기록하고 전달할 MException 객체도 생성해야 합니다. MException 생성자의 구문은 다음과 같습니다.

ME = MException(identifier, message)

여기서 identifier는 다음과 같은 형식의 MATLAB 메시지 ID로, 작은따옴표로 묶여 있습니다.

component:mnemonic

message는 오류를 설명하는 텍스트이며, 이 또한 작은따옴표로 묶여 있습니다. 출력값 ME는 결과로 생성되는 MException 객체입니다.

예외를 발생시키는 것이 아니라, 예외에 대응하는 경우에는 MException 객체를 따로 생성할 필요가 없습니다. 오류를 최초로 감지한 코드에 의해 이 객체가 이미 생성되고 채워져 있을 것이기 때문입니다.

MException 클래스의 속성

MException 클래스에는 여러 가지 속성이 있습니다. 이러한 속성은 각각 MException 객체를 나타내는 구조체의 필드로 구현됩니다. 이러한 각 속성에 대해서는 아래 섹션에서 설명하며, 예외에 대한 대응책 섹션과 예외 발생시키기 섹션에도 언급되어 있습니다. 이러한 속성은 모두 읽기 전용이므로 해당 값을 변경할 수 없습니다.

MException 속성은 다음과 같습니다.

입력값 없이 surf 함수를 호출하면 MATLAB이 예외를 발생시킵니다. 예외를 포착하면 MException 객체 구조체에 대한 속성을 볼 수 있습니다. (이 예제에서는 try/catch를 통상적이지 않은 방식으로 사용합니다. try/catch 사용에 대한 자세한 내용은 try/catch 문 섹션을 참조하십시오.)

try
    surf
catch ME
    ME
end

명령줄에서 이 코드를 실행하면 MATLAB은 다음과 같이 MException 객체의 내용을 반환합니다.

ME = 

  MException with properties:

    identifier: 'MATLAB:narginchk:notEnoughInputs'
       message: 'Not enough input arguments.'
         cause: {}
         stack: [1×1 struct]
    Correction: []

stack 필드는 다음과 같이 예외가 발생한 파일 이름, 함수, 라인 번호를 보여줍니다.

ME.stack
ans = 
    file: 'matlabroot\toolbox\matlab\graph3d\surf.m'
    name: 'surf'
    line: 54

이 경우 cause 필드와 Correction 필드는 비어 있습니다. 각 필드에 대해서는 다음 섹션에서 자세히 설명합니다.

메시지 ID

메시지 ID는 오류 또는 경고 문에 추가하는 태그로, 오류나 경고를 MATLAB에서 고유하게 인식할 수 있게 해 줍니다. 오류 보고에 메시지 ID를 사용하여 오류의 원인을 더 잘 식별할 수 있으며, 혹은 경고에 메시지 ID를 사용하여 프로그램 내에서 일부 경고를 선별해 제어할 수 있습니다.

메시지 ID는 오류나 경고에 대해 componentmnemonic 레이블을 지정하는 읽기 전용 문자형 벡터입니다. 간단한 식별자의 형식은 다음과 같습니다.

component:mnemonic

콜론으로 식별자의 두 부분인 componentmnemonic을 구분합니다. 식별자가 둘 이상의 component를 사용할 경우 이들을 구분하기 위해 콜론이 추가적으로 필요합니다. 메시지 ID는 항상 콜론을 최소 하나는 포함해야 합니다.

다음은 메시지 ID의 몇 가지 예입니다.

MATLAB:rmpath:DirNotFound
MATLAB:odearguments:InconsistentDataType
Simulink:actionNotTaken
TechCorp:OpenFile:notFoundInPath

component 필드와 mnemonic 필드는 모두 다음 구문 규칙을 준수해야 합니다.

  • 식별자 내에는 공백이나 탭 문자가 허용되지 않습니다.

  • 첫 문자는 영문자여야 하며, 대문자 또는 소문자일 수 있습니다.

  • 나머지 문자는 영숫자 또는 밑줄일 수 있습니다.

componentmnemonic에는 길이 제한이 없습니다. 식별자는 빈 문자형 벡터일 수도 있습니다.

component 필드.  component 필드는 다양한 오류와 경고가 파생될 수 있는 큰 범위의 범주를 지정합니다. 일반적으로 component에는 특정 제품이나 툴박스 이름(예: MATLAB 또는 Control)이거나, 위 예의 TechCorp와 같이 회사 이름이 들어갈 수 있습니다.

이 필드를 사용하여 여러 단계를 갖는 component를 지정할 수도 있습니다. 다음 명령문에는 세 단계의 component가 있으며, 그다음에 mnemonic 레이블이 나옵니다.

TechCorp:TestEquipDiv:Waveform:obsoleteSyntax

component 필드로서 각 식별자의 고유성을 보장할 수 있습니다. 따라서, 내부 MATLAB 코드의 경우 MATLAB:InconsistentDataType과 같은 특정 경고 ID를 사용할 수 있지만, 이 앞에 고유한 component를 지정하기만 하면 동일한 mnemonic을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

warning('TechCorp:InconsistentDataType', ...
   'Value %s is inconsistent with existing properties.' ...
   sprocketDiam)

mnemonic 필드.  mnemonic 필드는 일반적으로 특정 메시지와 관련된 태그로 사용됩니다. 예를 들어, 모호한 구문을 사용하여 발생한 오류를 보고할 때는 다음과 같이 간단한 component와 mnemonic이 적절할 수 있습니다.

MATLAB:ambiguousSyntax

MException 객체의 메시지 ID.  예외를 발생시킬 경우, 적절한 식별자를 만들고, 다음 구문을 사용하여 MException 객체를 생성할 때 식별자를 이 객체에 저장합니다.

ME = MException(identifier, text)

예를 들면 다음과 같습니다.

ME = MException('AcctError:NoClient', ...
      'Client name not recognized.');

ME.identifier
ans =
    AcctError:NoClient

예외에 대응할 경우, 여기 보이는 것처럼 MException 객체에서 메시지 ID를 추출할 수 있습니다. 다시 surf 예제를 사용하겠습니다.

try
    surf
catch ME
    id = ME.identifier
end

id =
    MATLAB:narginchk:notEnoughInputs

오류 메시지의 텍스트

MATLAB의 오류 메시지는 프로그램 코드에 의해 실행되는 읽기 전용 문자형 벡터이며, MException 객체에 반환됩니다. 이 메시지를 통해 사용자는 실패 원인과, 가능한 경우 해결 방법도 파악할 수 있습니다.

예외를 발생시킬 경우 적절한 오류 메시지를 작성하고, 다음 구문을 사용하여 MException 객체를 생성할 때 오류 메시지를 이 객체에 저장합니다.

ME = MException(identifier, text)

메시지에 sprintf 함수에 사용할 수 있는 것과 같은 형식 지정이 필요한 경우에는 MException 생성자에 다음 구문을 사용하십시오.

ME = MException(identifier, formatstring, arg1, arg2, ...)

예를 들면 다음과 같습니다.

S = 'Accounts';  f1 = 'ClientName';
ME = MException('AcctError:Incomplete', ...
      'Field ''%s.%s'' is not defined.', S, f1);

ME.message
ans =
    Field 'Accounts.ClientName' is not defined.

예외에 대응할 경우, 다음과 같이 MException 객체에서 오류 메시지를 추출할 수 있습니다.

try
    surf
catch ME
    msg = ME.message
end

msg =
    Not enough input arguments.

호출 스택

MException 객체의 stack 필드는 오류가 감지된 라인 번호, 함수, 파일 이름을 식별합니다. 다음 예제에서와 같이 호출된 함수에서 오류가 발생하는 경우, stack 필드에는 직접적인 오류의 위치에 대해서 뿐만이 아니라 각각의 호출하는 함수에 대한 라인 번호, 함수 이름, 파일 이름도 포함됩니다. 이 경우 stack은 Nx1 배열이며, 여기서 N은 호출 스택의 깊이를 나타냅니다. 즉, 스택 필드는 맨 위 함수에 도달할 때까지, 예외가 발생한 함수 이름과 라인 번호, 호출자의 이름과 라인 번호, 호출자의 호출자 등을 표시합니다.

예외를 발생시킬 경우, MATLAB은 호출 스택 정보를 stack 필드에 저장합니다. 이 필드에는 쓸 수 없으며, 읽기 전용 액세스만 가능합니다.

예를 들어, 다음과 같이 두 개의 다른 파일에 세 개의 함수가 있다고 가정하겠습니다.

 mfileA.m
=========================
        .
        .
42 function A1(x, y)
43 B1(x, y);



 mfileB.m
=========================
        .
        .
 8 function B1(x, y)
 9 B2(x, y)
        .
        .
26 function B2(x, y)
27      .
28      .
29      .
30      .
31 %  Throw exception here

변수 ME에서 예외를 포착한 다음 stack 필드를 검토합니다.

for k=1:length(ME.stack)
    ME.stack(k)
end

ans = 
    file: 'C:\matlab\test\mfileB.m'
    name: 'B2'
    line: 31
ans = 
    file: 'C:\matlab\test\mfileB.m'
    name: 'B1'
    line: 9
ans = 
    file: 'C:\matlab\test\mfileA.m'
    name: 'A1'
    line: 43

원인 배열

경우에 따라, 실행을 중지하게 만든 명령 하나뿐만이 아닌 코드가 포착한 기타 예외에 대한 정보도 기록하는 것이 중요할 수 있습니다. 이러한 추가 MException 객체를 주요 예외(Primary Exception)의 cause 필드에 저장할 수 있습니다.

MExceptioncause 필드는 관련 MException 객체로 구성된 선택적 셀형 배열입니다. cause 셀형 배열에 객체를 추가할 때는 다음 구문을 사용해야 합니다.

primaryException = addCause(primaryException, secondaryException)

이 예제에서는 변수 X에 배열 D 할당을 시도합니다. D 배열이 존재하지 않는 경우, 코드는 MAT 파일에서 이 배열을 불러온 다음 이를 다시 X에 할당하려고 시도합니다. 불러오기에 실패하면 새로운 MException 객체(ME3)가 생성되어 처음 두 개 오류(ME1ME2)의 원인을 저장합니다.

try
    X = D(1:25)
catch ME1
    try
        filename = 'test200';
        load(filename);
        X = D(1:25)
    catch ME2
        ME3 = MException('MATLAB:LoadErr', ...
               'Unable to load from file %s', filename);
        ME3 = addCause(ME3, ME1);
        ME3 = addCause(ME3, ME2);
    end
end

다음과 같이 ME3의 cause 필드에 두 개의 예외가 있습니다.

ME3.cause
ans = 
    [1x1 MException]
    [1x1 MException]

ME3cause 필드를 검토하여 관련 오류를 확인합니다.

ME3.cause{:}
ans =

	MException object with properties:

    identifier: 'MATLAB:UndefinedFunction'
       message: 'Undefined function or method 'D' for input 
arguments of type 'double'.'
         stack: [0x1 struct]
         cause: {}
ans =

	MException object with properties:

    identifier: 'MATLAB:load:couldNotReadFile'
       message: 'Unable to read file test204: No such file or 
directory.'
         stack: [0x1 struct]
         cause: {}

정정 사항

일부 예외에서는 예외 발생 시 수정 사항이 제안될 수 있습니다. 수정 사항을 제안하려면 예외를 발생시킬 때 matlab.lang.correction.AppendArgumentsCorrection 객체를 만든 다음 예외의 Correction 필드에 수정 사항을 추가하면 됩니다.

수정 사항을 Correction 필드에 추가할 때는 다음 구문을 사용해야 합니다.

primaryException = addCorrection(baseException,exceptionCorrection)

이 예제에서는 하나의 입력 인수를 필요로 하는 함수 hello를 만듭니다. 이 함수가 입력값 없이 호출될 경우 MATLAB은 오류를 생성하고 입력 인수 "world"를 수정 사항으로 제안합니다.

function hello(audience)
if nargin < 1
    me = MException('MATLAB:notEnoughInputs','Not enough input arguments.');
    aac = matlab.lang.correction.AppendArgumentsCorrection('"world"');
    me = me.addCorrection(aac);
    throw(me);
end
fprintf("Hello, %s!\n", audience);
end

이 함수를 인수 없이 호출할 경우 MATLAB은 수정 사항을 제안합니다.

hello
Error using hello (line 6)
Not enough input arguments.

Did you mean:
>> hello("world")

MException 클래스의 메서드

MException 클래스와 함께 사용할 수 있는 메서드는 여러 개가 있습니다. 이러한 메서드 이름은 대/소문자를 구분합니다. 자세한 내용은 MATLAB 함수 도움말 페이지를 참조하십시오.

메서드 이름설명
addCauseMException을 다른 MExceptioncause 필드에 추가합니다.
addCorrection현재 발생한 예외에 대한 수정 사항을 제안합니다.
getReport현재 예외를 기반으로 한 서식 지정된 메시지를 반환합니다.
MException.last가장 최근 uncaught exception을 반환합니다. 이는 정적 함수입니다.
rethrow이전에 포착된 예외를 다시 발생시킵니다.
throw예외를 발생시킵니다.
throwAsCaller예외를 발생시키지만, stack 필드에서 현재 스택 프레임을 생략합니다.