Вы можете использовать Throw[anyExpression]
или Throw[anyExpression, exceptionTag]
, чтобы вызвать исключение с любым выражением.Затем вы можете использовать Catch[your code]
или Catch[yourCode,exceptionPattern]
.Исключения в Mathematica не являются объектами, как, например, в Java, поэтому вы не можете напрямую использовать технику построения иерархий наследования исключений и использовать несколько операторов catch для выбора более специфичных и более общих.Теги исключений необходимы, чтобы придать исключению идентичность, чем-то похожее на имя класса исключения в Java.Throw
без второго аргумента вызовет исключение без тега, которое может быть перехвачено Catch
без второго аргумента.Если вы серьезно хотите использовать исключения в Mathematica, я бы посоветовал не использовать их, поскольку вы можете легко поймать то, что вы не планировали перехватывать - точно так же, как вы обычно не используете Exception в Java, а предпочли бы создать его подкласс.В Mathematica нет проверенных исключений, поэтому все исключения Mathematica можно считать исключениями времени выполнения.Поскольку второй аргумент Catch
является шаблоном, вы можете создавать Catch
команды, которые могли бы перехватывать исключения с разными тегами, несколько эмулируя иерархии наследования исключений в Java.Синтаксис также отличается - нет try
- вы просто оборачиваете Catch
вокруг фрагмента кода, из которого вы можете ожидать исключения.Обратите внимание, что Catch без второго аргумента не будет перехватывать помеченное исключение, в то время как Catch
со вторым аргументом не будет перехватывать непомеченное исключение.Если вы хотите и то и другое, вам может понадобиться вложиться как Catch [Catch [code, pattern]].Не существует предложения finally
, предоставляемого в качестве встроенного, но его можно эмулировать с помощью пользовательского кода, поскольку в Mathematica можно также программировать конструкции потока управления, используя нестандартную оценку (функции с Hold-атрибутами).так далее).Вы можете найти варианты использования Catch
и Throw
в документации, здесь на SO сообщениях и в MathGroup, и вы найдете множество хороших примеров.
HTH