2013-02-25 47 views
3

我在vb.net和Oracle数据库中有一个项目。当用户口令在oracle中过期时导致一个oracle的豁免。我处理该异常(打开ChangePassword形式和我更改密码),但我失去我正准备执行时,误差出现的过程:
例子:密码已过期

Try 
      conn = New OracleConnection 
      conn.ConnectionString = gApp.ConnectString 
      conn.Open() 

      'Let's say that error appears here, I want to retun here after password has been changed 

      cmd.Connection = conn 
      cmd.CommandText = "Delete_Transaction" 
      cmd.CommandType = CommandType.StoredProcedure 
      OracleCommandBuilder.DeriveParameters(cmd) 
      cmd.Parameters("in_transaction_id").Value = TransactionId 
      cmd.ExecuteNonQuery() 
      conn.Close() 


     Catch ex As OracleException 
      'PseudoCode: if error is PasswordExpired->open the ChengePassForm...blah,blah 
      'is handled by a Error class that i have 
     Finally 
      If Not conn Is Nothing Then 
       conn.Dispose() 
      End If 
     End Try 

的主要问题是,这个问题可以出现在代码无处不在,我的意思是不同的程序,不同的形式等。
所以我需要一个通用的解决方案。其实我甚至无法想象一个正确的逻辑来解决这个问题。任何人都可以告诉我一个方向?

回答

2

您可以制作一个功能,需要Action(Of OracleCommand)

Try Catch块中调用代理,并且如果密码更改,只需再次调用该操作以使用正确的密码重新运行代码。

你可以用lambda表达式来调用这个函数。
请注意,lambda表达式中的所有内容都可能运行多次。

+0

我不是那么熟悉的代表和lamdas表达。你可以说得更详细点吗? – Nianios 2013-02-25 15:34:04

1

使用嵌套的try catch语句:

Try 
    Try 
     conn = New OracleConnection 
     conn.ConnectionString = gApp.ConnectString 
     conn.Open() 

     'Let's say that error appears here, I want to retun here after password has been changed 
    Catch ex1 As OracleException 
     'PseudoCode: if error is PasswordExpired->open the ChengePassForm...blah,blah 
     'is handled by a Error class that i have 
    Catch ex2 As Exception 
     ' throw ex2 to be handled by the parent try catch 
    End Try 

    cmd.Connection = conn 
    cmd.CommandText = "Delete_Transaction" 
    cmd.CommandType = CommandType.StoredProcedure 
    OracleCommandBuilder.DeriveParameters(cmd) 
    cmd.Parameters("in_transaction_id").Value = TransactionId 
    cmd.ExecuteNonQuery() 
    conn.Close() 


Catch ex As Exception 
    'PseudoCode: if error is PasswordExpired->open the ChengePassForm...blah,blah 
    'is handled by a Error class that i have 
Finally 
    If Not conn Is Nothing Then 
     conn.Dispose() 
    End If 
End Try 
+0

问题是,您不知道何时何地出现错误。 – Nianios 2013-02-25 15:33:14

+1

您可以根据需要添加尽可能多的'try catch语句'。密码错误只会在登录时发生,而且由于您正在处理特定错误,因此您应该知道错误发生的位置。 – 2013-02-25 15:39:41