【发布时间】:2021-06-18 10:56:00
【问题描述】:
我在 net-standard 2.1 (C# 8.0) 项目中实现了一些静态 throw 辅助方法。
[DoesNotReturn]
public static void InvalidOperation(String message, String caller, String path, Int32 line)
{
throw new InvalidOperationException($"{message}\n{caller}|{path}|{line}");
}
我想在 NET 5.0 项目中使用它们,例如:
public static BitmapSource GetBitmapSource(String uri)
{
if (Uri.TryCreate(uri, UriKind.RelativeOrAbsolute, out Uri? _uri))
{
return new BitmapImage(_uri);
}
Throw.InvalidOperation( $"Invalid uri {uri}.");
}
但是编译器还是返回错误CS0161:“Not all code paths return a value”
【问题讨论】:
-
puplic?好的,您不应该使用Throw.InvalidOperation( $"Invalid uri {uri}.");之类的方法抛出异常您可以执行异常 fablic 并使用类似:throw MyExceptionGenerator.InvalidOperation($"Invalid uri {uri}.");,但最佳做法是通过new运算符生成异常 - 您应该生成新的异常类并使用如下:throw new MyInvalidOperaionException($"Invalid uri {uri}.") -
我喜欢使用 CallerMemberName、CallerFilePath 和 CallerLineAttributes 来定位引发异常的位置。这就是我使用这些辅助方法的原因。我已经多次看过这些辅助方法。喜欢这里:endjin.com/blog/2020/08/…
-
属性可以帮助编译器进行额外的分析,但据我所知,它们仍然不允许你违反可达性的语言规则......你的方法结束就编译器而言仍然可以访问。
-
这不是我想听到的,斯基特先生。 :-( 不过,感谢您的澄清。
-
类似于 ExceptionDispatchInfo.Throw。我们知道它后面的行无法访问,但语言需要返回。您可以输入一个虚拟返回或抛出 null,但这不是最好的事情......或者只是切换到上面评论中的建议,
throw ThrowHelper.Whatever()或切换您执行检查的顺序
标签: c# code-analysis c#-8.0