相关疑难解决方法(0)

保留动态调用方法的异常

我想动态调用一个MethodInfo对象,并且从它内部抛出的任何异常向外传递,就像它被正常调用一样.

我看来有两种选择.它们概述如下.

选项1保持抛出的异常的类型MyStaticFunction,但是StackTrace因为它而被破坏throw.

选项2维护StackTrace异常,但异常的类型始终如此TargetInvocationException.我可以提取InnerException它的类型,但这意味着我不能写这个例子:

try { DoDynamicCall(); }
catch (MySpecialException e) { /* special handling */ }
Run Code Online (Sandbox Code Playgroud)

选项1:

void DoDynamicCall()
{
    MethodInfo method = /*referencing MyClass method void MyStaticFunction(int x)*/;
    try
    {
        method.Invoke(null, new object[] { 5 });
    }
    catch (TargetInvocationException e)
    {
        throw e.InnerException;
    }
}
Run Code Online (Sandbox Code Playgroud)

选项2:

void DoDynamicCall()
{
    MethodInfo method = /*referencing MyClass method void MyStaticFunction(int x)*/;
    method.Invoke(null, new …
Run Code Online (Sandbox Code Playgroud)

c# reflection exception

10
推荐指数
1
解决办法
6324
查看次数

捕获/修改(消息)/ Rethrow相同类型的异常

我想要一个中心位置从异常中提取信息,将我需要的所有信息设置为其消息参数,然后将该信息重新抛出为相同类型的异常.

更好的解决方案可能是在最终处理异常的地方执行此操作(并记录其消息),但是..我可以控制抛出异常的地方,而不是接收异常的地方记录其消息内容.

除了那个设计决定,并且假设message是一个readonly属性,我会(?)以某种方式创建一个新的Exception对象,有没有办法让新的异常对象与原始异常对象相同?

这是我的代码,它不编译 - 它偶然发现了抛出线(我尝试动态转换对象).

public static void RethrowExceptionWithFullDetailInMessage(string msg, Exception ex)
{
    Exception curEx = ex;
    int cnt = 0;
    while (curEx != null)
    {
        msg += "\r\n";
        msg += cnt++ + " ex.message: " + curEx.Message + "\r\n";
        msg += "Stack: " + curEx.StackTrace;
        curEx = curEx.InnerException;
    }
    object newEx = Convert.ChangeType(new Exception(msg), ex.GetType());
    throw (ex.GetType())newEx;
}
Run Code Online (Sandbox Code Playgroud)

做这个

throw (Exception)newEx;
Run Code Online (Sandbox Code Playgroud)

保留类型?(它汇编.)

Convert.ChangeType是否确保我得到了正确类型的异常?

c# casting exception throw

7
推荐指数
2
解决办法
6202
查看次数

标签 统计

c# ×2

exception ×2

casting ×1

reflection ×1

throw ×1