当前位置: 首页 > 知识库问答 >
问题:

使用ExceptionDispatchInfo时获取“并非所有代码路径都返回值”。捕获

罗晨
2023-03-14

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

下面是代码的简化版本:

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方法(根据编译器)并不总是返回值。我可以在异常DispatchInfo之后添加一个return false。捕获,但我想知道是否有更好的方法来实现同样的目标。不写入冗余的返回false。

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

共有2个答案

朱渝
2023-03-14

不提供冗余或重复代码的最简单解决方案是只将实际要抛出的东西放入您的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();
}
颛孙轩昂
2023-03-14

还有一个选项:不是添加冗余的返回false 您可以添加一个冗余的抛出 。然后,您就不需要填写返回值。(好吧,对一个傻瓜来说没什么大不了的)

 类似资料:
  • 我已经编写了一些云函数,可以正确地执行批处理。在此实例中,由于数据库模式的原因,我必须搜索与userA uid或userB uid字段匹配的文档。 这个模式并不是最聪明的,如果有更好的解决方案,请让我知道。它用于应用程序的消息传递方面。其中每个文档都有一组userA和UserB的字段。 当用户更改其用户名,并且“Conversations”集合中包含该用户数据的文档必须更新时,此功能将被触发。 我

  • 我正在尝试使用WireMock创建动态模拟。我有一个情况,如果我指定URL,如 <代码>http://localhost:8989/api/account/121 那我应该收到这样的回复: 简而言之,path param在响应体中返回,但是我不确定应该如何捕获121并使用wiremock在响应中返回它。 对于这种请求 或者 我可以使用什么,所以响应将过滤掉id和角色并放入响应中。 我正在使用独立的

  • 问题内容: 假设我的数据库方案如下: 如果我运行第一个查询来获取所有产品及其用户(如果有的话),则会得到以下信息: 对我来说看上去很好。现在,如果我想做同样的事情,除了我希望每行有一个产品,并使用级联的用户名(如果有任何用户,否则为NULL): 如果没有产品的用户,即使存在 LEFT JOIN ,GROUP_CONCAT也会阻止mysql为该产品生产线。 这是预期的MySQL行为吗? 有什么办法可

  • 问题内容: 我正在从PHP调用python脚本。 python程序必须根据传递给它的参数返回一些值。 这是一个示例python程序,它将为您提供我目前正在做什么的基本概念: 从上面的代码中可以看到,我的基本目标是 以便python程序根据参数返回一些值(0、1、4、8等)。 然后,调用PHP的程序访问这些返回的值并执行适当的操作。 目前,我已经为此目的使用了“ sys.exit(n)”。 我使用s

  • 本文向大家介绍使用C#代码获取存储过程返回值,包括了使用C#代码获取存储过程返回值的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接给大家贴C#代码了。 ps:在C#中调用存储过程中的两种返回值

  • 问题内容: 我正在使用Selenium2对我的网站进行一些自动化测试,并且希望能够获得一些Javascript代码的返回值。如果我的网页中有Javascript函数,并且想调用该函数并将返回值获取到我的Python代码中,该怎么做? 问题答案: 要返回值,只需在传递给方法的字符串中使用JavaScript关键字,例如