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

How could i let Resharper or Intellisense know that a method allwayse throws exception?

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

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

我在我的代码中的 100 多个地方使用了这个方法,问题是当我在另一个方法中使用这个方法时,必须 return 一个值 Re-sharper 不明白没有需要 returning 一个值,例如:

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
}

你不应该在这样的方法上使用异常,因为异常是为了在方法由于异常情况而无法实现其目标时引发,而不是总是。

您应该使用像

这样的自定义异常
public class MyException():Exception
{ 
    public MyException(): base("Your text goes here")
    {
        // do some logging
    }
}

您还可以将属性添加到您的自定义异常 class,并保存有关它们的其他信息,例如

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
    }
}

这里有两个问题。

首先,您可以向 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# 编译器不会关心这个,仍然会抱怨缺少 return。

您可以详细了解 ReSharper 理解的各种属性 here: ReSharper Code Annotations Attributes

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

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

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