Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103790215
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-20 21:33:19

作者:    文章来源:    

 

  错误处理

  Try-Catch-Finally 结构的错误处理是 .NET 语言的一部分。 下面是使用 Try-Catch-Finally 语法的一个相对最小的例子:
Dim conn As New OracleConnection(oradb) ' VB.NET 
Try 
    conn.Open() 

    Dim cmd As New OracleCommand 
    cmd.Connection = conn 
    cmd.CommandText = "select dname from dept where deptno = " + TextBox1.Text 
cmd.CommandType = CommandType.Text 

    If dr.Read() Then 
        Label1.Text = dr.Item("dname") ' or use dr.Item(0) 
    End If 
Catch ex As Exception ' catches any error 
    MessageBox.Show(ex.Message.ToString()) 
Finally 
    conn.Dispose() 
End Try 

OracleConnection conn = new OracleConnection(oradb); // C# 
try 
{ 
conn.Open(); 

OracleCommand cmd = new OracleCommand(); 
    cmd.Connection = conn; 
    cmd.CommandText = "select dname from dept where deptno = " + textBox1.Text; 
cmd.CommandType = CommandType.Text; 

    if (dr.Read()) // C# 
    { 
        label1.Text = dr.GetString(0); 
    } 
} 
catch (Exception ex) // catches any error 
{ 
    MessageBox.Show(ex.Message.ToString()); 
} 
finally 
{ 
    conn.Dispose(); 
} 
  虽然这种方法将适当地捕获尝试从数据库中获取数据时发生的任何错误,但这种方法对用户却不友好。 例如,看看下面这条在数据库不可用时显示的消息。

图 6
图 6: 捕获到一个 ORA-12545 错误,并向用户显示。

  Oracle DBA 或开发人员很清楚 ORA-12545 的意义,但是最终用户不清楚。 一种更好的解决方案是添加一条额外的 Catch 语句来捕获最常见的数据库错误并显示对用户友好的消息。
Catch ex As OracleException ' catches only Oracle errors 
    If InStr(1, ex.Message.ToString(), "ORA-1:", CompareMethod.Text) Then 
        MessageBox.Show("Error attempting to insert duplicate data.") 
    ElseIf InStr(1, ex.Message.ToString(), "ORA-12545:", CompareMethod.Text) Then 
        MessageBox.Show("The database is unavailable.") 
    Else 
        MessageBox.Show("Database error: " + ex.Message.ToString()) 
    End If 
Catch ex As Exception ' catches any error 
    MessageBox.Show(ex.Message.ToString()) 

catch (OracleException ex) // catches only Oracle errors 
{ 
    switch (ex.Number) 
    { 
case 1: 
            MessageBox.Show("Error attempting to insert duplicate data."); 
            break; 
        case 12545: 
            MessageBox.Show("The database is unavailable."); 
            break; 
        default: 
            MessageBox.Show("Database error:" + ex.Message.ToString()); 
            break; 
    } 
} 
catch (Exception ex) // catches any error 
{ 
    MessageBox.Show(ex.Message.ToString()); 
} 
  注意上面的代码示例中的两条 Catch 语句。 如果没有捕获到任何 Oracle 错误,那么将跳过第一条 Catch 语句分支,让第二条 Catch 语句来捕获其他任何类型的错误。 在代码中,应该根据从特殊到一般的顺序对 Catch 语句排序。 在实施了对用户友好的异常处理代码之后,ORA-12545 错误消息显示如下:

图 7
图 7: 针对 ORA-12545 错误的对用户友好的消息


  Finally 代码将始终执行,而无论错误是否发生。 通过在 Finally 代码块中加入连接对象的 Close 或 Dispose 方法调用,在执行了 Try-Catch-Finally 代码段之后,数据库连接将始终关闭。 试图关闭没有打开的数据库连接不会导致错误。 例如,如果数据库不可用,数据库连接没有打开,那么 Finally 代码块将试图关闭不存在的连接。 执行多余的 Close 或 Dispose 是无效的。 只需将一条 Close 或 Dispose 方法放到 Finally 代码块中,将保证关闭连接。

阅读(395) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~