3

在 c# 中,我可以捕获有关(非)连接到 Oracle 数据库的所有错误吗?

我不想捕获有关编写错误的查询的错误,而只想捕获诸如没有侦听器,连接丢失之类的错误...

如果查询写得不好(或表丢失),那么这是我的错。但是,如果 Oracle 或网络出现故障,那么这应该由另一个部门持有。

4

6 回答 6

2

编写代码,在 try catch 部分中构建连接:

try
{
   BuildConnection(connectionString);
}
catch (OracleException ex)
{
   //Connectivity Error
}
于 2013-06-06T12:41:49.220 回答
1

此类问题的简单答案是使用Try CatchBlock like

try
{
   // your code
}
catch (OracleException ex)
{

}

MSDN 帮助

于 2013-06-06T12:47:55.627 回答
1

ORA-12150 到 ORA-12236 之间的错误与连接错误有关。几个例子:

ORA-12154: TNS: 无法解析指定的连接标识符

ORA-12152: TNS: 无法发送中断消息

ORA-12157: TNS: 内部网络通信错误

请参考https://docs.oracle.com/cd/E11882_01/server.112/e17766/net12150.htm

于 2019-07-02T08:17:47.917 回答
0

System.Data.SqlClient.SqlException 中仍然会捕获诸如 No listener, connection lost 之类的错误,但是,您可以检查 ErrorCode 和 Errors 以相应地处理不同的情况,例如,不是侦听器或连接丢失等。

MSDN 似乎没有记录所有可能的错误,但是,您可以编写一些单元测试或集成测试来了解 ErrorCode 和 Errors 中出现的内容,然后在生产代码中相应地编写错误处理程序。

OracleException 仅包含错误代码而不包含错误。因此,您可能正在使用 switch(e.ErrorCode) 来处理不同的情况。

于 2013-06-06T12:55:42.557 回答
0

当然 - 您可以捕获特定的异常类型,或者如果它们都是相同的异常类型,您可以捕获它,检查它是否是特定类型,然后重新抛出您不想处理的异常类型。没有你的语法,这里有一个例子......

try
{
   // your Oracle code
}
catch (OracleException ex)
{
   if (ex.Message == "Something you don't want caught")
   {
      throw;
   }
   else
   {
       // handle
   }
}
于 2013-06-06T12:44:50.783 回答
0

我观察到每次发生网络异常时,都会在内部异常中找到一个SocketException。

我还观察到,当发生网络异常时,第一个内部异常的类型是«OracleInternal.Network.NetworkException»,但不幸的是,这个类是内部的......

基于这些观察,我将编写如下代码:

public void RunQuery()
{
    try
    {
        var con = new OracleConnection("some connection string");

        con.Open();

        var cmd = con.CreateCommand();
        // ... 

        cmd.ExecuteNonQuery();
    }
    catch (Exception ex) when (IsNetworkException(ex))
    {
        // Here, a network exception occurred
    }
    catch (Exception ex)
    {
        // Here, an other exception occurred
    }
}

private static bool IsNetworkException(Exception ex)
{
    var exTmp = ex;
    while (exTmp != null)
    {
        if (exTmp is SocketException)
            return true;

        exTmp = exTmp.InnerException;
    }

    return false;
}
于 2020-10-07T15:05:36.080 回答