Sin*_*atr 2 c# dbml exception-handling exception
在这种方法中
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
}
}
Run Code Online (Sandbox Code Playgroud)
我可以收到例外
System.Data.SqlClient.SqlException(0x80131904):数据库'blablabla.mdf'不存在.提供有效的数据库名称.要查看可用的数据库,请使用sys.databases.
如果Detach()在未附加数据库时调用,则会发生这种情况.
我的问题是:如何只吞下这个特定的消息以避免记录它?
文本可能已本地化,因此无法使用
if(!(e is SqlException && e.Message.Contains("Supply a valid database name")))
... // log
Run Code Online (Sandbox Code Playgroud)
我不确定错误代码是否对于这个特定情况是唯一的(google证明了吗?)
if(!(e is SqlException && e.Message.Contains("0x80131904")))
... // log
Run Code Online (Sandbox Code Playgroud)
我当然能做到
try { ... } catch {}
Run Code Online (Sandbox Code Playgroud)
但后来我没有机会记录一些意想不到的东西,这可能有助于我解决问题,以防它出现.
您不想检查消息 - 您要检查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)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
(我通常不会赶上普通Exception...但是这可能是一个不同的问题.)
| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |