我怎么能让 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");
}
我有一个抛出异常的方法:
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");
}