#c_sharp
Есть класс со множеством методов но при выпадении определенного исключения (в любом из методов) например IndexOutOfRangeException должен стработать определенный обработчик, всегда одинаковый для любого метода. Есть ли способ и если есть то как этого можно добится кроме прописывания try {} catch(){} finaly {} в каждый метод отдельно ? UPD: Я пытался в конструктор класса добавить событие UnhandledException: AppDomain.CurrentDomain.UnhandledException += (s, e) => { //...обрабатываем исключение }; Далее в случайный метод добавил код, который приведет к исключению : private void Somemethod() { Convert.ToInt32("2.3"); .... Исключение выпало но не обработалось, в чем ошибка ?
Ответы
Ответ 1
Вы можете использовать AOP-инструменты, например PostSharp. http://doc.postsharp.net/exception-handling Минусы: лезет в скомпилированный код, требует установки у всех, кто будет работать над проектом. Пример: [PSerializable] public class DisplayErrorAttribute : OnExceptionAspect { Type type; public DisplayErrorAttribute(Type type) { this.type = type; } public override Type GetExceptionType(MethodBase method) { return this.type; } public override void OnException(MethodExecutionArgs args) { Console.WriteLine(args.Exception.Message); args.FlowBehavior = FlowBehavior.Return; args.ReturnValue = -1; } } [DisplayError(typeof(IndexOutOfRangeException))] public class Test { public void Foo() { var array = new int[] { 0 }; Console.WriteLine(array[1]); } public void Bar() { var array = new int[] { 0 }; Console.WriteLine(array[1]); } public void Baz() { var array = new int[] { 0 }; Console.WriteLine(array[0]); } } class Program { static void Main(string[] args) { var test = new Test(); test.Foo(); test.Bar(); test.Baz(); Console.ReadKey(); } } Результат: Ошибка в методе Foo: Индекс находился вне границ массива. Ошибка в методе Bar: Индекс находился вне границ массива. 0
Комментариев нет:
Отправить комментарий