我怎么能让Resharper或Intellisense知道一个方法allwayse抛出异常?

时间:2015-01-04 09:57:14

标签: c# exception resharper intellisense

我有一个抛出异常的方法:

public void MyMethod()
{
    // do some logging
    throw new Exception("My Text");
}

我在我的代码中超过100个地方使用此方法,问题是当我在另一个必须返回值的方法中使用此方法时重新锐化剂量不能理解不需要返回值,例如:

public int AnotherMethod()
{
    // some stuff
    MyMethod(); // <= it always throws exception

    return 0; // i have to put this code, while it never executes
}

有没有办法告诉Re-sharper MyMethod就是这样的例外:

public int AnotherMethod()
{
    // some stuff
    throw new Exception(); // <= it always throws exception        
    //return 0; <= this line is no more needed
}

3 个答案:

答案 0 :(得分:9)

这里有两个问题。

首先,您可以为代码分析提供ReSharper提示,我将向您展示如何。

然而,这里的问题不是ReSharper,而是编译器。这些提示不会说服编译器。你展示的方法:

public int AnotherMethod()
{
    // some stuff
    MyMethod(); // <= it always throws exception

    return 0; // i have to put this code, while it never executes
}

即使你说服ReSharper理解MyMethod总是抛出异常,也必须这样写。这与ReSharper无关,这只是C#编译器。

为了告诉ReSharper您的方法以某种方式运行,您可以使用属性标记它。您需要将这些属性的源代码副本复制到项目中,或引用ReSharper注释程序集。完成后,您可以像这样标记MyMethod

[ContractAnnotation("=> halt")]
public void MyMethod()
...

然而,再一次,C#编译器不会关心这一点,并仍然会抱怨丢失的返回。

您可以阅读有关ReSharper了解here: ReSharper Code Annotations Attributes的各种属性的更多信息。

答案 1 :(得分:2)

你不应该对这样的方法使用异常,因为异常意味着当一个方法因为EXCEPTIONAL条件而无法实现其目标时会引发异常,而不是总是如此。

您应该使用自定义异常,例如

public class MyException():Exception
{ 
    public MyException(): base("Your text goes here")
    {
        // do some logging
    }
}

您还可以向自定义异常类添加属性,并保存其他信息,如

public class MyException():Exception
{ 
    public long Id { get; set; }

    public MyException(long id): base("Your text goes here")
    {
        this.Id = id;
        // and do some logging
    }
}

答案 2 :(得分:0)

您应该创建一个例外并抛出它。例如

public int AnotherMethod()
{
    // some stuff
    throw MyMethod(); // now it is obvious it always throws an exception
}

public Exception MyMethod(){
   return new Exception("new exception");
}