每个线程或每个任务的异常设置?

Posted

技术标签:

【中文标题】每个线程或每个任务的异常设置?【英文标题】:Per-thread or per-task exception settings? 【发布时间】:2017-10-05 05:23:47 【问题描述】:

我有一个 C# 项目。是否可以编写这样的代码:“如果在执行此类任务时发生异常(并且调试器可用),请立即中断,而不展开调用堆栈。”

另外,我只想说,如果这不可能,我可以回答这个问题。

【问题讨论】:

不明白,不能加个try catch块,在catch块里加断点吗? 调用堆栈被展开 您的问题中没有足够的上下文来准确理解您要做什么以及为什么不能这样做。如果您的代码抛出异常,您可以在throw 处设置断点。如果其他代码抛出异常,在您从代码中调用它之后,您可以将调试器设置设置为始终在该异常类型上中断,而不是仅在未处理时中断。请更准确地解释您正在尝试做什么以及具体您无法弄清楚。 Exception thrown in debug mode, but where?的可能重复 Force break on any exception thrown in program的可能重复 【参考方案1】:

你应该看看 System.Diagnostics.Debugger 类 (https://msdn.microsoft.com/en-us/library/system.diagnostics.debugger(v=vs.110).aspx)

使用这个类,您可以检查调试器是否已附加,如果是,您可以中断。

您也可以将其包装在实用程序类的静态方法中,以便您轻松使用它

public static class DebuggerHelpers

    [Conditional("DEBUG")]
    public static void BreakIfDebugging()
    
        if (System.Diagnostics.Debugger.IsAttached)
        
             System.Diagnostics.Debugger.Break()
        
    

条件属性 (https://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute(v=vs.110).aspx) 将导致在未定义 DEBUG(AKA 版本)时省略对该方法的所有调用。

【讨论】:

是的,但它不是每个线程的,我必须在调用堆栈中留下引发异常的点。 您是否只是想要一种简单的方法来忽略对外部 API 的调用会引发异常? 我认为没有简单的方法可以做到这一点。您最好的选择是某种 IL 织布器,它可以获取您的代码,并且基本上将每个语句包装在 try catch 块中,如果调试器连接到 break,则包装在 catch break 中。这将使您的代码保持干净并添加您正在寻找的行为。【参考方案2】:

如果您想离开引发异常的点并保留调用堆栈,您只能通过记录 StackTrace AFAIK 来做到这一点。

public static class Logger

  ...

  public static string CurrentStackDefaultLog()
  
    // the true value is used to include source file info
    var l_CurrentStack = new System.Diagnostics.StackTrace(true);
    return l_CurrentStack.ToString();
  

  ...

Daniele Mazzeranghi

在https://www.codeproject.com/Articles/223611/How-to-log-the-current-call-stack-in-NET 中提供了实现此代码的良好链接

【讨论】:

【参考方案3】:

根据其他答案,我的问题的答案似乎是无法完成。

【讨论】:

以上是关于每个线程或每个任务的异常设置?的主要内容,如果未能解决你的问题,请参考以下文章

线程池异常处理之重启线程处理任务

Centos 设置httpd-2.2 or httpd-2.4 MPM模式

如何设置任务或线程权限?

Jmeter - 线程组详解

Spring Boot 内嵌容器Undertow参数设置

Spring Boot 内嵌容器Undertow参数设置