声明方法始终引发异常的属性,以满足BC42105

Attribute to declare that a method always throws an exception, to satisfy BC42105

提问人:Perringaiden 提问时间:11/14/2023 最后编辑:marc_sPerringaiden 更新时间:11/14/2023 访问量:24

问:

编译器警告 当函数中存在不返回值或引发异常的分支时,会发生编译器警告BC42105。但是,我有一种情况,我在调用的方法中抛出异常,它总是会抛出。代码分析似乎没有检测到这一点,我找不到可以确保不必手动抑制编译器错误的属性。

在 VB.Net 中,使用 .NET 7.

所需代码:

Private ReadOnly cgItems As IDictionary(Of Integer, Item)

Public Function GetItem(itemID as Integer) As Item
    Dim item as Item = Nothing

    If cgItems.TryGetValue(itemID, item) tThen
        Return item
    Else
        ThrowItemDoesntExist(itemID)
    End If
End Function

Private Sub ThrowItemDoesntExist(itemID As Integer)
    Throw New ArgumentException($"The Item ID #{itemID} does not exist.", NameOf(itemID))
End Sub

该方法是从完成此类检查的多个位置调用的,因此使用单个方法可以实现一致性和轻松的代码维护。ThrowItemDoesntExist

但是,会引发BC42105警告,因为 无法指示它始终抛出 .GetItemThrowItemDoesntExistException

当前解决方法

我目前的解决方法是使用该属性,这有点笨拙。它有效,但感觉不对。<DoesNotReturn>CodeAnalysis

Imports System.Diagnostics.CodeAnalysis

Private ReadOnly cgItems As IDictionary(Of Integer, Item)

Public Function GetItem(itemID as Integer) As Item
    Dim item as Item = Nothing

    If cgItems.TryGetValue(itemID, item) tThen
        Return item
    Else
        Return ThrowItemDoesntExist(itemID)
    End If
End Function

<DoesNotReturn>
Private Function ThrowItemDoesntExist(itemID As Integer)
    Throw New ArgumentException($"The Item ID #{itemID} does not exist.", NameOf(itemID))
End Sub

谁能提出更好的方法?

vb.net .net-core compiler-warnings

评论

0赞 jmcilhinney 11/14/2023
这个。它特别指出,该属性的含义是“方法或属性永远不会返回。换句话说,它总是抛出一个例外”。这正是你想要的,所以它是完全正确的。
0赞 Perringaiden 11/15/2023
@jmcilhinney - 这就是我使用它的原因,但我试图避免必须格式化它,就好像它返回了一些东西一样。仅应用属性不会消除警告。它必须重新格式化为并使其成为消除该警告的功能。如果我将属性放在调用方函数上,它是不准确的,因为当项目存在时,它确实会返回。如果解决方法是它“应该工作”的方式,那么它是一个笨拙的实现,但就这样吧。Returns ThrowItemDoesntExistThrowItemDoesntExist
0赞 jmcilhinney 11/15/2023
我的猜测是,代码分析只是孤立地查看每个方法的主体,而不是查看该方法调用的方法内部。它可以从外部看到每个被调用的方法,这就是属性起作用的原因,但是如果它查看这些方法的内部,那么它会在哪里结束?这将是更多的工作,因此会产生性能问题。

答: 暂无答案