Представлять переменную try..catch без исключения или фильтр с использованием методов фабрики дерева выражений - PullRequest
0 голосов
/ 31 марта 2019

Какой метод фабрики в System.Linq.Expressions.Expression следует вызвать для создания дерева выражений, точнее, экземпляра CatchBlock, который представляет catch в следующем коде C #:

try {
    // ...
} catch {
    // ...
}

Все перегрузки метода Catch , по-видимому, требуют либо типа исключения - эквивалент этого:

catch (Exception) {
    // ...
}

и / или ParameterExpressionкоторый будет связан с исключением - эквивалент этого:

catch (Exception ex) {
    // ...
}

Передача null в первый аргумент (и приведение к Type, чтобы избежать двусмысленности):

// using static System.Linq.Expressions.Expression

Catch((Type)null, Constant(true));

вызывает ArgumentNullException .

Метод MakeCatchBlock имеет такое же поведение

1 Ответ

1 голос
/ 03 апреля 2019

Использование try {...} catch {...} для перехвата исключений, генерируемых компонентами, отличными от .Net, и, следовательно, не наследует от System.Exception, ошибочно, поскольку CLR автоматически оборачивает такие исключения в RuntimeWrappedException, что, очевидно, наследует System.Exception - и поэтому вы можете использовать try {...} catch(Exception e) {...} для перехвата этих исключений.

Поэтому нет необходимости обрабатывать простой try {...} catch {...} отдельно от try {...} catch (Exception e) {...}, так как они оба будут перехватывать все исключения.

...