Наверняка, вы знаете что в C# есть такая конструкция, как using. И, скорее всего, в курсе, что использовать его можно и нужно только с объектами, реализующими интерфейс IDisposable (и, соответственно, скорее всего, что-то делающими с неуправляемыми ресурсами). На всякий случай, напомню, что конструкция вида:
1 2 3 4 | using (someType obj = new someType()) { //тут что-то происходит } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | someType obj = new someType(); try { //тут что-то происходит } finally { //если объект значимого типа (value-type) ((IDisposable)obj).Dispose(); //или, если объект ссылочного типа (reference-type) if (obj!= null ) ((IDisposable)obj).Dispose(); } |
А нет его по двум причинам, во-первых, если блока catch в такой конструкции нет, то исключение благополучно отправляется выше с полным трейсом всего произошедшего, так что, у пользовательского кода всегда будет возможность поймать его и, например, записал в лог именно в том виде, в котором оно случилось.
Ну в во-вторых, как я уже написал вышел, если объект реализует интерфейс IDisposable, то значит, что он работает с неуправляемыми низкоуровневыми объектами, так что, даже не предполагается, что вы заходите на что-то повлиять из вашего кода.
В случае же, если вам все-таки очень нужно поймать исключение из using, что называется, "не отходя от кассы", то самый лучший вариант, это обернуть в в try..catch весь using. например, вот так:
1 2 3 4 5 6 7 | try { using (someType obj = new someType()) { //тут что-то происходит } } |
Полезная статья. Спасибо!
ОтветитьУдалить