Использование операторов не имеет ничего общего с исключениями. Использование блоков просто гарантирует, что Dispose вызывается для объекта в блоке using, когда он выходит из этого блока. И.Е .:
using(SqlConnection conn = new SqlConnection(conStr))
{
//use conn
}//Dispose is called here on conn.
Если при открытии соединения возникает исключение (или что-то еще в этом блоке по этому вопросу), оно все равно будет пузыриться до вершины и будет похоже на любое другое незапланированное исключение.
Отличный идиоматический способ - сохранить ссылку на старый метод и вызвать ее внутри нового.
def oldPlus = Integer.metaClass.getMetaMethod("plus", [Integer] as Class[])
Integer.metaClass.plus = { Integer n ->
return oldPlus.invoke(oldPlus.invoke(delegate, n), 1)
}
assert 5 == 2 + 2
На самом деле это не так хорошо задокументировано, и я планировал разместить в блоге сообщение именно на эту тему сегодня вечером или завтра :).
Используйте это, чтобы "испортить" метод plus:
Integer.metaClass.plus {Integer n -> delegate - (-n) - (-1)}
assert 2+2 == 5
Неудивительно, что использование оператора '+' в методе перегрузки plus приведет к StackOverflow, необходимо использовать что-то другое, кроме '+' оператор.
Другой механизм: используйте XOR или магию битовых операторов.
С уважением, Мирный огонь