尝试/捕获无法捕获异常

6

我有一个使用FiddlerApplication保存一些会话的项目。当我在重新启动后首次启动程序时,100%失败,然后10%失败,90%正常工作。

最大的问题是,在try/catch中它没有捕获到任何异常,这是我的代码:

static class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        try
        {
            browserToRun.GoTo("www.test.com"); 
            FiddlerApplication.AfterSessionComplete +=  FiddlerApplication_AfterSessionComplete;

            //HERE it fails
            FiddlerApplication.Startup(8888, true, true, true);
            FiddlerApplication.Shutdown();
        }
        catch (Exception ex)
        {
            // it is not getting to here
            FiddlerApplication.AfterSessionComplete -= FiddlerApplication_AfterSessionComplete;
            FiddlerApplication.Shutdown();
        }
    }

    public static void FiddlerApplication_AfterSessionComplete(Session sess)
    {
        try
        {
            if (!sess.fullUrl.Contains("test"))
            return;
            GlobalDownloadLink = sess.fullUrl;
        }
        catch (Exception ex)
        {
            successful = false;

            throw new System.ArgumentException(ex.Message, "FiddlerApplication_AfterSessionComplete");
        }
    }
}

我的新更新的Apconfig出现了新的错误,配置系统初始化失败。

<configuration>

  <runtime>
    <legacyCorruptedStateExceptionsPolicy enabled="true" />
  </runtime>
<configSections>

</configSections>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>

  <appSettings>
    <add key="BrowserShow" value="Y"/>
    <add key="DebugCreate" value="true"/>
    <add key="FileName10" value="AccountActivity"/>
    <add key="FileName20" value="ForeignActivities"/>
    <add key="FileNameShar" value="MatbeotSchirim"/>
  </appSettings>
</configuration>

抛出了什么异常?如果您没有指定异常(例如捕获NullReferenceException e),那么它将永远无法被处理。 - Ben
另外,我注意到你有一行代码 GlobalDownloadLink = sess.fullUrl;。这是在你的 return; 之后,你确定这样做是正确的吗? - Ben
通过指定异常,它并不会无差别地捕获每个异常吗? - Guillaume Beauvois
正在抛出什么异常?这是我的问题,我在函数中放置了断点,但捕获失败而没有捕获异常。 - Vladimir Potapov
"GlobalDownloadLink" 如果 fullUrl 包含 "test",那么是正确的,我不需要 URL。 - Vladimir Potapov
3个回答

7

除非在函数(您代码中的Main函数)上指定属性[HandleProcessCorruptedStateExceptions],否则某些异常不会被try..catch块捕获。当然,如Oxoron所述,也可以通过修改配置文件来实现相同的效果。


1
在编程中,我们可以使用[HandleProcessCorruptedStateExceptions]属性来捕获破坏应用程序内存状态的异常,例如“AccessViolationException”。 - Amit Kumar Ghosh
你能否通过添加Console.Writeline重新检查异常是否被捕获?我也不理解在FiddlerApplication_AfterSessionComplete的catch块中重新抛出异常的目的是什么... - Peter Brennan
我觉得我找到问题了。我有一个WatIn对象,它是线程,而这个FiddlerApplication也在那里,所以我需要将它分离到另一个类中,但还是谢谢你。 - Vladimir Potapov
1
@VovaPotapov,我不太明白你的实际问题是什么,能否请你更详细地描述一下你的解决方案?我猜你已经将FiddleApplication分离到另一个类中或者做了类似的操作,对吗?我也遇到了同样的问题,Fiddler会导致我的应用程序冻结,所以你的答案会对我有很大帮助。 - Bahadir Tasdemir

6
尝试在配置文件中添加以下内容:<runtime><legacyCorruptedStateExceptionsPolicy enabled="true" /></runtime>。参考这里

旧的CLR 异常吞没策略 - Amit Kumar Ghosh
添加后,我遇到了另一个错误 - 配置系统初始化失败。 - Vladimir Potapov

1
你的代码中有一个问题,就是你在处理Sessions的后台线程中抛出了System.ArgumentException异常;这样的异常不会被主线程上的异常处理程序捕获。
除此之外,你现在的代码编写方式是错误的;调用Startup然后立即调用Shutdown将没有任何有用的作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接