考虑以下分析器:
public void AnalyzeNode(SyntaxNode node, SemanticModel semanticModel, Action<Diagnostic> addDiagnostic, CancellationToken cancellationToken)
{
var throwStatement = node as ThrowStatementSyntax;
var isObjectCreationExpression = throwStatement.Expression is ObjectCreationExpressionSyntax;
var obj = throwStatement.Expression as ObjectCreationExpressionSyntax;
var isCorrectTypeOfExpression = (obj.Type as IdentifierNameSyntax).Identifier.Text == typeof(ArgumentException).Name;
}
With SyntaxKind.ThrowStatement
作为兴趣类型。
obj
应该null
如果抛出的异常尚未在表单中声明new Exception()
但更确切地说是呈现为throw e
where e
是先前声明的异常。
这反过来会抛出一个NullReferenceException
when obj.Type
之后立即调用。
有问题的示例:
static void Method1()
{
throw new ArgumentException();
}
static void Method2(ArgumentException e)
{
throw e;
}
首先throw
会很好地通过分析仪,但第二个会导致obj
to be null
因为它不是类型ObjectCreationExpressionSyntax
.
在沙盒 Visual Studio 环境中,这将显示为信息消息:
用户诊断分析器“FormattingFixes.EmptyArgumentException.ArgumentExceptionAnalyzer”引发异常,并显示消息“对象引用未设置到对象的实例。”。
在这个简短的示例中,很容易看出问题出在哪里,但在一个不那么做作的示例中,将很难发现问题。行和列都是1
,没有帮助。
在“传统”编程中,您的环境会自动显示抛出运行时异常的位置以及该时间点的值。我可以在代码中的某个位置放置一个随机断点,每次命中时查看所有值并尝试从那里推断出它,但是一旦节点数量远高于这两个值,这种方法就无法很好地扩展。
我们怎样才能轻松地找到代码中哪一行导致了运行时异常呢?