如何在C#源生成器的自定义诊断警告中添加异常详情?
解决方案
- 你之前使用的
Properties属性是供代码分析逻辑内部传递自定义数据用的,不会在VS错误列表的UI中展示,不能用来存储用户可见的异常详情。 - 要实现类似内置警告的展开效果,需要用到
Diagnostic的两个核心字段:- 基础消息:通过
DiagnosticDescriptor的messageFormat占位符填充,直接显示在错误列表的主条目里 - 展开详情:通过
Diagnostic.Create的description参数传入,点击错误条目展开后会显示这段内容
- 基础消息:通过
修改后的可用代码如下:
[Generator] public sealed partial class MyGenerator : ISourceGenerator { private static readonly DiagnosticDescriptor UnexpectedErrorDiagnostic = new DiagnosticDescriptor( id: "MYCUSTOMID001", title: "生成过程发生意外错误", messageFormat: "处理对象时出错:{0}", // 增加占位符承载简要错误信息 category: "Design", DiagnosticSeverity.Warning, isEnabledByDefault: true, description: "源生成器执行过程中出现未处理的异常,展开可查看完整堆栈信息"); public void Execute(GeneratorExecutionContext context) { try { // 可能抛出异常的业务逻辑 } catch (Exception ex) { context.ReportDiagnostic(Diagnostic.Create( descriptor: UnexpectedErrorDiagnostic, location: Location.None, messageArgs: new object[] { ex.Message }, // 填充占位符的简要信息 properties: null, // 这里传入完整异常详情,展开后会显示 description: ex.ToString())); } } }
修改后在VS2022错误列表中点击这个警告条目,就可以看到展开的完整异常信息,包括异常类型、消息、调用堆栈、内部异常详情等内容,和内置警告的展示逻辑完全一致。如果需要展示更结构化的内容,可以自行格式化ex.ToString()的输出,比如单独拆分内部异常、补充生成上下文信息等。
内容的提问来源于stack exchange,提问作者Jamie Burns
相关产品推荐
相关产品推荐

