如何让Resharper或Intellisense知道一个方法总是抛出异常?

5

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

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

我在我的代码中使用这个方法超过100次,问题是当我把这个方法用在另外一个必须返回值的方法中时,Resharper并不理解这里并不需要返回值,例如:

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
}

不完全符合您的要求,但是从 http://www.jetbrains.com/resharper/webhelp80/Reference__Code_Annotation_Attributes.html#ContractAnnotationAttribute 中的 [ContractAnnotation("=> halt")] public void TerminationMethod() - ta.speot.is
我已经在下面回答了你的问题,但是为什么你想要这个方法呢?一个总是抛出异常的方法有什么净收益呢? - Lasse V. Karlsen
同时记录异常和日志的目的在于同时完成这两个操作。 - Ehsan Zargar Ershadi
3个回答

10

这里有两个问题。

首先,您可以给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理解的各种属性的更多信息:ReSharper代码注释属性


谢谢,太好了,我希望我能给你投多次票。 - Ehsan Zargar Ershadi

2

在像这样的方法中,不应使用异常,因为异常是用于在由于异常情况而无法实现其目标时引发的,而不是始终如此。

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

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
你应该创建一个异常并抛出它。例如:
public int AnotherMethod()
{
    // some stuff
    throw MyMethod(); // now it is obvious it always throws an exception
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接