我有以下代码:
try
{
Data.CreateUserAndAccount.ExecuteProcedure(accountName, firstName, lastName, email, password);
return String.Empty;
}
catch (SqlException databaseError)
{
string result = IdentifyError(databaseError);
return result;
}
catch (Exception)
{
throw;
}
Run Code Online (Sandbox Code Playgroud)
我通过违反唯一键故意抛出 SQL 异常。但是,异常被Exception
而非捕获SqlException
。当我检查InnerException
详细信息时,异常类型为System.Data.SqlClient.SqlException
。
为什么 SQL 异常只能被泛型捕获Exception
?
问题是您正在尝试 catch SqlException
,但这不是异常类型:它是 InnerException。
如果user10954641是对的,并且它是UpdateException
,你可以简单地捕捉到:
try
{
}
catch (UpdateException e)
{
}
Run Code Online (Sandbox Code Playgroud)
如果是不同的异常,则捕获实际抛出的任何异常类型。或者,您可以有条件地捕获 InnerException 为的异常SqlException
:
try
{
}
catch (Exception e) when (e.InnerException is SqlException)
{
}
Run Code Online (Sandbox Code Playgroud)
如果您想知道为什么catch (SqlException)
不起作用,请考虑以下代码:
public void ThrowException()
{
try
{
MakeDatabaseCall();
}
catch (Exception e)
{
throw new Exception("Uh oh!", e);
}
}
public void MakeDatabaseCall()
{
throw new SqlException();
}
Run Code Online (Sandbox Code Playgroud)
对 的调用ThrowException()
最终会产生一个错误 form MakeDatabaseCall()
,但异常类型不会是SqlException
因为我们将它包装在另一个异常中(在本例中为异常基类):Exception
。但是,因为我们将抛出的异常传递给MakeDatabaseCall()
构造函数,所以我们的“哦哦!” 异常将SqlException
在其InnerException
字段中包含。
当您使用try
/ 时catch(ExceptionType e)
,您是在指示 .NET 在决定catch
输入哪个语句之前对异常进行模式匹配。为了说明起见,下面的两段代码大致等效:
try
{
}
catch(SqlException e)
{
//catches an SqlException
}
Run Code Online (Sandbox Code Playgroud)
和
try
{
}
catch(Exception e) when (e is SqlException)
{
//catches an SqlException
}
Run Code Online (Sandbox Code Playgroud)
显然,在我们的ThrowException
示例中,Exception
不是派生自SqlException
,因此catch (SqlException e)
不会匹配。
归档时间: |
|
查看次数: |
1599 次 |
最近记录: |