【问题标题】:Getting "not all code paths return a value" when using ExceptionDispatchInfo.Capture使用 ExceptionDispatchInfo.Capture 时获取“并非所有代码路径都返回值”
【发布时间】:2015-01-30 09:54:51
【问题描述】:

我正在研究一种使用反射来调用另一个方法的方法。然而,那个“其他方法”可以抛出一个异常,我想用它的原始堆栈信息和InnerException传播那个异常。那只是因为使用反射的方法不应该处理异常,调用者应该。

这是代码的简化版本:

public static bool Test() {
    try {
        return (bool) typeof(Program).GetMethod("OtherMethod").Invoke(null, null);
    } catch(TargetInvocationException ex) {
        ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
    }
}

public static bool OtherMethod() {
    throw new InvalidOperationException();
}

该代码显然无法编译,因为Test 方法(根据编译器)并不总是返回值。 我可以在ExceptionDispatchInfo.Capture 之后添加return false,但我想知道是否有更好的方法来实现同样的目标。不用写多余的return false

我知道这是一个挑剔的问题,但我不禁想知道。另外,冗余代码让我很痒:P

【问题讨论】:

  • 您在这里没有太多选择。编译器无法推断出Throw() 实际上会抛出,所以从它的角度来看,有些代码路径确实不返回值。添加return 语句似乎是唯一的解决方案。
  • 这有多简单?因为这段代码可能只是 throw ex.InnerException; 。简化似乎损害了这个问题。

标签: c# reflection


【解决方案1】:

还有另一种选择:您可以添加一个冗余的throw;,而不是添加一个冗余的return false;。 然后,您不需要编写返回值。 (好吧,bool 没什么大不了的)

【讨论】:

    【解决方案2】:

    不会给您提供冗余或重复代码的最简单的解决方案是仅将实际上要抛出的东西放入您的 try 中。创建你的bool,分配它false并返回它都是“安全”的操作,所以把它们放在try之外。

    public static bool Test()
    {
        bool returnValueOfInvoke = false;
        try
        {
            returnValueOfInvoke = (bool)typeof(Program).GetMethod("OtherMethod").Invoke(null, null);    
        }
        catch(TargetInvocationException ex)
        {
            ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
        }
        return returnValueOfInvoke;
    }
    
    public static void OtherMethod()
    {
        throw new InvalidOperationException();
    }
    

    【讨论】:

    • 请查看修改后的问题,Invoke() 应该返回一个布尔值。忘了添加那方面。
    • 基本一样的交易;实例化一个将进入try 的变量,获取该值,然后将其取出以供您返回。如果你真的想要,你可以让它为空,并在try 之后检查空值,如果它仍然为空,则抛出合适的东西。
    猜你喜欢
    • 2014-07-17
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2013-10-06
    相关资源
    最近更新 更多