调用throw时出现未处理的异常

时间:2011-10-14 05:41:32

标签: c#

catch (OracleException e)
{
    Cursor.Current = Cursors.Default;
    _instance = null;

    if (e.ErrorCode == -2147483648) // {"ORA-01017: invalid username/password; logon denied"}
    {
        throw new Exception("Nepravilno ime uporabnika ali geslo");
    }
    else
    {
        throw new Exception("Ne morem se povezati na podatkovno bazo. Preveri povezavo!");      
    }
}

但我总是得到Unhandled异常。为什么呢?

4 个答案:

答案 0 :(得分:2)

冒着陈述明显的风险......因为你没有抓住Exception你扔进了你的拦截区?或者,也许是try块中不存在OracleException的其他内容。

你期待发生什么?

为了完全清楚(为了确保我们在同一页面上),抛出但从未被捕获的异常将导致未处理的异常(根据定义)。从catch块中抛出异常与从其他任何地方抛出异常相同;还需要一个try-catch来抓住它。例如,将捕获此异常:

try {
    throw new Exception("Out of cheese error");    // Caught below
}
catch (Exception) {   }

但是这个导致了一个新的例外:

try {
    throw new Exception("Out of cheese error");    // Caught below
}
catch (Exception) {
    throw new Exception("418: I'm a teapot");    // Never caught
}

此代码捕获了两个例外:

try {
    try {
        throw new Exception("Out of cheese error");    // Caught in inner catch
    }
    catch (Exception) {
        throw new Exception("418: I'm a teapot");     // Caught in outer catch
    }
}
catch (Exception e) {
    Console.WriteLine(e.Message);    // "418: I'm a teapot"
}

答案 1 :(得分:1)

您的代码无论如何都不会吞下异常。它只是捕获一种类型的异常并抛出另一种类型的异常。如果在编写此代码之前有未处理的异常,则在编写代码后仍然会有一个异常。

- 更新 -

参考您对其他答案的评论,如果您想显示消息并停止执行代码,请尝试: -

catch (OracleException e)
{
    Cursor.Current = Cursors.Default;
    _instance = null;

    if (e.ErrorCode == -2147483648) // {"ORA-01017: invalid username/password; logon denied"}
    {
        MessageBox.Show("Nepravilno ime uporabnika ali geslo");
    }
    else
    {
        MessageBox.Show("Ne morem se povezati na podatkovno bazo. Preveri povezavo!");      
    }

    // this exits the program - you can also take other appropriate action here
    Environment.FailFast("Exiting because of blah blah blah");
}

答案 2 :(得分:1)

因为您只处理OracleException。什么都没有处理你正在抛出的异常()。

您正在捕获OracleException,这意味着您已准备好处理它 - 处理它对您意味着什么?记录并继续前进?设置一些状态并继续前进?当然,你不想在数据访问组件中弹出gui吗?如果你不准备处理它,让它冒泡并在外层处理它。

您也不应该抛出Exception类型的异常。创建自己的强类型异常,以便可以处理它们,或者简单地记录和调用throw;这会重新抛出原文。

如果抛出新类型的异常,请确保将原始异常作为内部异常传递,以确保您不隐藏详细信息。

我写了一些关于C#例外的最佳实践:

Trying to understand exceptions in C#

希望有所帮助

答案 3 :(得分:1)

我假设您调用层次结构如下:

Main
    |-YourMethod
                try {}
                catch (OracleException) {throw new Exception("blah blah")}

所以你看,OracleException中出现的YourMethodcatch阻挡了,但是你又扔了一个进入Main的新的OracleException处理它。所以你应该在上一级添加一个异常处理程序。

另外,请勿隐藏原始throw new Exception("your message", e),以这种方式抛出异常{{1}}。这将保留调用堆栈。