使用表达式树工厂方法表示没有异常变量或过滤器的 try..catch
Represent try..catch without exception variable or filter using expression tree factory methods
我应该调用 System.Linq.Expressions.Expression
中的哪个工厂方法来创建表达式树——更具体地说,一个 CatchBlock
实例——它代表以下 C# 代码中的 catch
:
try {
// ...
} catch {
// ...
}
All the overloads of the Catch method 似乎需要一个异常类型——相当于这个:
catch (Exception) {
// ...
}
and/or 将绑定到异常的 ParameterExpression
- 相当于:
catch (Exception ex) {
// ...
}
将 null
传递给第一个参数(并转换为 Type
以避免歧义):
// using static System.Linq.Expressions.Expression
Catch((Type)null, Constant(true));
导致 ArgumentNullException。
MakeCatchBlock method 具有相同的行为
使用 try {...} catch {...}
捕获从非 .Net 组件抛出的异常并因此不继承自 System.Exception
是错误的,因为 CLR 自动用 RuntimeWrappedException
包装此类异常这显然继承了 System.Exception
- 因此你也可以使用 try {...} catch(Exception e) {...}
来捕获异常。
因此,没有必要将 try {...} catch {...}
与 try {...} catch (Exception e) {...}
分开处理,因为它们都将捕获所有异常。
我应该调用 System.Linq.Expressions.Expression
中的哪个工厂方法来创建表达式树——更具体地说,一个 CatchBlock
实例——它代表以下 C# 代码中的 catch
:
try {
// ...
} catch {
// ...
}
All the overloads of the Catch method 似乎需要一个异常类型——相当于这个:
catch (Exception) {
// ...
}
and/or 将绑定到异常的 ParameterExpression
- 相当于:
catch (Exception ex) {
// ...
}
将 null
传递给第一个参数(并转换为 Type
以避免歧义):
// using static System.Linq.Expressions.Expression
Catch((Type)null, Constant(true));
导致 ArgumentNullException。
MakeCatchBlock method 具有相同的行为
使用 try {...} catch {...}
捕获从非 .Net 组件抛出的异常并因此不继承自 System.Exception
是错误的,因为 CLR 自动用 RuntimeWrappedException
包装此类异常这显然继承了 System.Exception
- 因此你也可以使用 try {...} catch(Exception e) {...}
来捕获异常。
因此,没有必要将 try {...} catch {...}
与 try {...} catch (Exception e) {...}
分开处理,因为它们都将捕获所有异常。