小编Mar*_*rkJ的帖子

Try-Catch-Finally阻止了.NET4.5.1的问题

我有一个简单的测试代码在.NET3.5中按预期工作,但在使用.NET4.5.1创建的项目中,相同的代码表现完全不同.

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string a = null;
            var x = a.Length;
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            Console.WriteLine("This is the finally block.");
        }
        Console.WriteLine("You should not be here if an exception occured!");
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,奇怪的是,在运行编译的RELEASE exe文件时,.NET4.5.1中完全忽略了NullReferenceException类型异常.基本上,不会抛出任何错误,但在调试模式下会抛出异常.

第二个(也是最重要的),如果错误与NullReferenceException不同,例如"索引超出范围",则实际上会按预期抛出异常,但是"finally"块永远不会被命中,而不是我期望从try-catch-finally块中获得的行为.我试过不同的机器,我的另外两个同事也在尝试,我们都得到了相同的结果.

似乎我从未真正理解try-catch-finally块,或者.NET4.5.1以不同的方式处理异常,或者.NET4.5.1存在一些错误.我所知道的是上面的代码在.NET3.5中工作,正如我所期望的那样,但是在.NET4.5.1中运行它时似乎没有得到相同的结果.

有人可以对此有所了解吗?我现在完全失去了.

编辑 根据Eric J的回答,我能够解决NullReferenceException问题.自从我提出两个问题后,我将为第二个问题创建一个新线程. Try-Catch-Finally阻止了.NET4.5.1的问题

c#

22
推荐指数
1
解决办法
606
查看次数

Try-Catch-Finally阻止了.NET4.5.1的问题

我有一个简单的try-catch-finally代码块,它在.NET3.5中按预期工作,但在使用.NET4.5.1创建的项目中,相同的代码表现完全不同.基本上,在.NET4.5.1中,如果发生异常而不是我在try-catch-finally块中预期的行为,则"finally"块不会被命中.我试过不同的机器,我的另外两个同事也在尝试,我们都得到了相同的结果.这对我来说很关心,因为我使用finally块来关闭DataReader,某些连接以及诸如此类的东西.

如果在没有调试器的RELEASE模式下抛出异常或运行RELEASE编译的EXE文件时,.NET4.5.1不会触发"finally"块.在调试模式下,两个.NET版本都达到了"finally"块.

同样,下面的代码在.NET3.5 RELEASE模式下没有调试器但在.NET4.5.1中没有表现.我错过了什么吗?有人可以帮忙吗?

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string a = null;
            var x = a.Length;
            Console.WriteLine(x);
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            Console.WriteLine("This is the finally block.");
        }
        Console.WriteLine("You should not be here if an exception occured!");
    }
}
Run Code Online (Sandbox Code Playgroud)

c# exception

17
推荐指数
2
解决办法
708
查看次数

标签 统计

c# ×2

exception ×1