Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Capturar información sobre excepciones

Visión general

Cuando se produce una excepción, captura información sobre la causa en una estructura de datos denominada objeto.MATLAB®MException Este objeto es una instancia de la clase.MATLABMException Puede tener acceso al objeto por la excepción antes de que el programa se anula y acceder al objeto construido para este error en particular a través del comando.MExceptionCapturaatrapar Al generar una excepción en respuesta a un error en su propio código, tendrá que crear un nuevo objeto y almacenar información sobre el error en ese objeto.MException

En esta sección se describe la clase y los objetos construidos a partir de esa clase.MException

La información sobre cómo usar esta clase se presenta en secciones posteriores y.Responda a una excepciónLance una excepción

La clase MException

La figura mostrada a continuación ilustra una posible configuración de un objeto de la clase.MException El objeto tiene cinco propiedades:,,, y.identifiermessagestackcauseCorrection Cada una de estas propiedades se implementa como un campo de la estructura que representa el objeto.MException El campo es una matriz N-by-1 de estructuras adicionales, cada una de las cuales identifica una función y el número de línea de la pila de llamadas.stack El campo es una matriz de celdas M-by-1 de objetos, cada uno de los cuales representa una excepción que está relacionada con la actual.causeMException

Consulte para obtener una descripción completa de estas propiedades.Las propiedades de la clase MException

Constructor de objetos

Cualquier código que detecte un error y lance una excepción también debe construir un objeto en el que registrar y transferir información sobre el error.MException La sintaxis del constructor esMException

ME = MException(identifier, message)

donde es una de la formaidentifierMATLABidentificador de mensaje

component:mnemonic

que está encerrado entre comillas simples, y es texto, también encerrado entre comillas simples, que describe el error.message La salida es el objeto resultante.MEMException

Si responde a una excepción en lugar de lanzar una, no tiene que construir un objeto.MException El objeto ya se ha construido y rellenado por el código que detectó originalmente el error.

Las propiedades de la clase MException

La clase tiene varias propiedades.MException Cada una de estas propiedades se implementa como un campo de la estructura que representa el objeto.MException Cada una de estas propiedades se describe en las secciones siguientes y se hace referencia en las secciones en y.Responda a una excepciónLance una excepción Todos son de sólo lectura; no se pueden cambiar sus valores.

Las propiedades son:MException

Si se llama a la función sin entradas, se produce una excepción.surfMATLAB Si captura la excepción, puede ver las propiedades de la estructura del objeto.MException (Este ejemplo se utiliza de forma atípica.try/catch Consulte la sección para obtener más información sobre el uso).La instrucción try/catchtry/catch

try     surf catch ME     ME end

Ejecútelo en la línea de mandatos y devuelva el contenido del objeto:MATLABMException

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

El campo muestra el nombre de archivo, la función y el número de línea donde se ha lanzado la excepción:stack

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

En este caso, los campos y están vacíos.causeCorrection Cada campo se describe con más detalle en las secciones siguientes.

Identificadores de mensaje

Un identificador de mensaje es una etiqueta que se adjunta a una instrucción de error o advertencia que hace que ese error o ADVERTENCIA sea reconocible de forma única.MATLAB Puede utilizar identificadores de mensaje con informes de errores para identificar mejor el origen de un error o con advertencias para controlar cualquier subconjunto seleccionado de las advertencias de los programas.

El identificador de mensaje es un vector de caracteres de solo lectura que especifica una y una etiqueta para un error o advertencia.ComponenteMnemónica El formato de un identificador simple es

component:mnemonic 

Un colon separa las dos partes del identificador: y.ComponenteMnemónica Si el identificador utiliza más de uno, se requieren dos puntos adicionales para separarlos.Componente Un identificador de mensaje siempre debe contener al menos un signo de dos puntos.

Algunos ejemplos de identificadores de mensaje son

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

Ambos campos deben cumplir las siguientes reglas de sintaxis:ComponenteMnemónica

  • No se permite ningún espacio en blanco (espacio o caracteres de tabulación) en cualquier parte del identificador.

  • El primer carácter debe ser alfabético, ya sea en mayúsculas o en minúsculas.

  • Los caracteres restantes pueden ser alfanuméricos o un guión bajo.

No hay ninguna limitación de longitud a la o.ComponenteMnemónica El identificador también puede ser un vector de caracteres vacío.

Campo de componente.  El campo especifica una categoría amplia bajo la cual se pueden generar varios errores y advertencias.Componente Los componentes comunes son un nombre de caja de herramientas o un producto concreto, como, por ejemplo, o, o quizás el nombre de la empresa, como en el caso anterior.MATLABControlTechCorp

También puede utilizar este campo para especificar un componente multinivel. La siguiente instrucción tiene un componente de tres niveles seguido de una etiqueta mnemotécnica:

TechCorp:TestEquipDiv:Waveform:obsoleteSyntax 

El campo de componente le permite garantizar la exclusividad de cada identificador. Por lo tanto, si bien el código interno puede utilizar un determinado identificador de advertencia como, que no impide el uso de la misma mnemotécnica, siempre y cuando se le precede con un componente único.MATLABMATLAB:InconsistentDataType Por ejemplo,

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

Mnemonic Field.  El campo se utiliza normalmente como una etiqueta relacionada con el mensaje en particular.Mnemónica Por ejemplo, cuando se notifica un error resultante del uso de sintaxis ambigua, un componente simple y mnemotécnico como el siguiente podría ser apropiado:

MATLAB:ambiguousSyntax 

Los identificadores de mensaje en un objeto MException.  Al generar una excepción, cree un identificador adecuado y guárdelo en el objeto en el momento de construir el objeto utilizando la sintaxisMException

ME = MException(identifier, text)

Por ejemplo,

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

Al responder a una excepción, puede extraer el identificador del mensaje del objeto como se muestra aquí.MException Usando el ejemplo de nuevo,surf

try     surf catch ME     id = ME.identifier end  id =     MATLAB:narginchk:notEnoughInputs 

Texto del mensaje de error

Un mensaje de error en es un vector de caracteres de solo lectura emitido por el código de programa y devuelto en el objeto.MATLABMException Este mensaje puede ayudar al usuario a determinar la causa, y posiblemente el remedio, del error.

Al generar una excepción, redacte un mensaje de error adecuado y guárdelo en el objeto en el momento de construir el objeto utilizando la sintaxisMException

ME = MException(identifier, text)

Si el mensaje requiere especificaciones de formato, como las disponibles con la función, utilice esta sintaxis para el constructor:sprintfMException

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

Por ejemplo,

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. 

Al responder a una excepción, puede extraer el mensaje de error del objeto de la siguiente manera:MException

try     surf catch ME     msg = ME.message end  msg =     Not enough input arguments. 

La pila de llamadas

El campo del objeto identifica el número de línea, la función y el nombre de archivo donde se detectó el error.stackMException Si el error se produce en una función llamada, como en el ejemplo siguiente, el campo contiene el número de línea, el nombre de la función y el nombre de archivo no solo para la ubicación del error inmediato, sino también para cada una de las funciones de llamada.stack En este caso, es una matriz N-by-1, donde N representa la profundidad de la pila de llamadas.stack Es decir, el campo de pila muestra el nombre de la función y el número de línea donde se produjo la excepción, el nombre y el número de línea del llamador, el llamador del llamador, etc., hasta que se alcanza la función superior.

Al generar una excepción, almacena la información de la pila de llamadas en el campo.MATLABstack No se puede escribir en este campo; acceso es de solo lectura.

Por ejemplo, supongamos que tiene tres funciones que residen en dos archivos independientes:

 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 

Catch la excepción en variable y, a continuación, examine el campo:MEstack

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

La matriz de causa

En algunas situaciones, puede ser importante registrar información sobre no sólo el comando que provocó la ejecución para detener, sino también otras excepciones que el código capturado. Puede guardar estos objetos adicionales en el campo de la excepción principal.MExceptioncause

El campo de un es una matriz de celdas opcional de objetos relacionados.causeMExceptionMException Debe utilizar la siguiente sintaxis al agregar objetos a la matriz de celdas:cause

primaryException = addCause(primaryException, secondaryException)

Este ejemplo intenta asignar una matriz a variable.DX Si la matriz no existe, el código intenta cargarlo desde un archivo MAT y, a continuación, vuelve a intentar asignarlo.DX Si se produce un error en la carga, se construye un nuevo objeto () para almacenar la causa de los dos primeros errores (y):MExceptionME3ME1ME2

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

Hay dos excepciones en el campo de la causa de:ME3

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

Examine el campo de para ver los errores relacionados:causeME3

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: {}

La corrección

Algunas excepciones pueden tener una corrección que se puede sugerir cuando se produce la excepción. Si está lanzando una excepción, puede sugerir una corrección creando un objeto y agregándolo al campo de la excepción.matlab.lang.correction.AppendArgumentsCorrectionCorrection

Debe utilizar la siguiente sintaxis al agregar una corrección al campo:Correction

primaryException = addCorrection(baseException,exceptionCorrection)

En este ejemplo se crea una función que requiere un argumento de entrada.hello Si se llama a la función sin entradas, produce y error y sugiere el argumento de entrada como una corrección.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

Cuando se llama a la función sin un argumento, sugiere una corrección.MATLAB

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

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

Los métodos de la clase MException

Hay varios métodos que puede utilizar con la clase.MException Los nombres de estos métodos distinguen entre mayúsculas y minúsculas. Consulte las páginas de referencia de función para obtener más información.MATLAB

Nombre del métodoDescripción
addCauseAnexar un al campo de otro.MExceptioncauseMException
addCorrectionProporcione una corrección sugerida para la excepción actual.
getReportDevolver un mensaje con formato basado en la excepción actual.
MException.lastDevuelva la última excepción no detectada. Esta es una función estática.
rethrowVuelva a emitir una excepción que se ha capturado anteriormente.
throwEmita una excepción.
throwAsCallerEmita una excepción, pero omita el marco de pila actual del campo.stack