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异常。为什么呢?
答案 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
中出现的YourMethod
被catch
阻挡了,但是你又扔了一个进入Main
的新的OracleException
处理它。所以你应该在上一级添加一个异常处理程序。
另外,请勿隐藏原始throw new Exception("your message", e)
,以这种方式抛出异常{{1}}。这将保留调用堆栈。