You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#源生成器的自定义诊断警告中添加异常详情?

解决方案
  • 你之前使用的Properties属性是供代码分析逻辑内部传递自定义数据用的,不会在VS错误列表的UI中展示,不能用来存储用户可见的异常详情。
  • 要实现类似内置警告的展开效果,需要用到Diagnostic的两个核心字段:
    1. 基础消息:通过DiagnosticDescriptor的messageFormat占位符填充,直接显示在错误列表的主条目里
    2. 展开详情:通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:15:04