Try/Catch править

try/catch состоит из блока try, за которым следует одно или несколько предложений catch, в которых определяются обработчики для различных исключений.
Исключения могут быть указаны одним из трех способов:

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

Блок success является необязательным и если он указан выполняется, только если не произошло исключения.
Блок finally выполняется после выполнения кода из блока try, независимо от того, происходит ли передача управления в результате нормальной работы, вызова операторa break, continue, return, или появления исключения в блоке try. В рамках обработки исключений, связанный блок finally гарантированно будет выполнен.
Блок finally полезен для очистки ресурсов, выбранных в блоке try, и для выполнения любого кода, который должен выполняться даже при возникновении исключения в блоке try.

Синтаксис править

try
    <statements>
catch <VarName> as <exceptionType>  (*1)   or
catch <exceptionType>             (*2)   or
catch                           (*3)
    <statements>    
[success                         (*4)
    <statements> ]

[finally                         (*4)
    <statements> ]
  • 1 - указывает переменную для размещения обработки исключение (или возобновления исключения) в последующих catch блоков
  • 2 - используйте эту форму, чтобы поймать исключение ExceptionType, когда не нуждаетесь в обработке исключения (чтобы проигнорировать исключение или выход).
  • 3 - получить любое и все исключения. Может быть указан только один раз и если используется, то должен быть указан после всех других блоков.
  • 4 - не обязательно

Пример править

# parsing numbers
s = tok.text.replace('_', '')
if s.endsWith('f')
    s = s[:-1]
try
    value = float.parse(s, Utils.cultureInfoForNumbers)
catch FormatException
    .recordError('Unexpected FormatException for float literal "[tok.text]".')
catch OverflowException
    .recordError('Range overflow for float literal "[tok.text]".')


# reading file contents
contents = 'test: failure'
try
    contents = File.readAllText('myFile.txt')
catch ioe as IOException
    print 'I/O Error: [ioe.message]'
success
    assert 'test' in contents
    
# customException
try
    if source.length==0
        _warning('File is empty.')
    else if source.trim.length==0
    _warning('File is completely blank.')
    return _parseTokens()
catch pe as ParserException
    if _errorRecorder, _errorRecorder.recordError(pe)
    _tokenizer = nil
    throw  # rethrow exception trapped above