如何吞咽..有特定原因的例外

本文关键字:何吞咽 | 更新日期: 2023-09-27 18:34:10

在此方法中

    public static void Detach()
    {
        try
        {
            using (var master = new DataContext(@"Data Source=(LocalDB)'MSSQLLocalDB;Initial Catalog=master;Integrated Security=True"))
            {
                master.ExecuteCommand(string.Format("ALTER DATABASE [{0}] SET OFFLINE WITH ROLLBACK IMMEDIATE", DatabaseFile));
                master.ExecuteCommand(string.Format("exec sp_detach_db '{0}'", DatabaseFile));
            }
        }
        catch (Exception e)
        {
           ... // add to log
        }
    }

我可以收到异常

System.Data.SqlClient.SqlException (0x80131904):数据库"blablabla.mdf"不存在。提供有效的数据库名称。若要查看可用的数据库,请使用 sys.databases。

如果在未附加数据库时调用Detach()则会发生这种情况。

我的问题是:如何仅吞下此特定消息以避免记录它?

文本可能已本地化,因此不起作用

if(!(e is SqlException && e.Message.Contains("Supply a valid database name"))) 
    ... // log 

我不确定错误代码对于这种特定情况是否是唯一的(谷歌证明了这一点?

if(!(e is SqlException && e.Message.Contains("0x80131904"))) 
    ... // log 

我当然可以做

try { ... } catch {}

但是,我没有机会记录一些意想不到的事情,这可能有助于我解决问题,以防万一出现。

如何吞咽..有特定原因的例外

您不想检查消息 - 您想检查 SQL 特定编号。为此,可以使用 SqlException.Number 属性。

我会使用:

// I think this is right, based on
// http://technet.microsoft.com/en-us/library/cc645936(v=sql.105).aspx
private const int DatabaseDoesNotExistCode = 15010;
...
catch (SqlException e)
{
    if (e.Number != DatabaseDoesNotExistCode)
    {
        ...
    }
}

(我通常不会捕捉到普通Exception...但这可能是另一回事。