The Microsft SQL Server-specific error code for a deadlock is 1205 so you’d need to handle the SqlException and check for that. So, e.g. if for all other types of SqlException you want the bubble the exception up:
catch (SqlException ex)
{
if (ex.Number == 1205)
{
// Deadlock
}
else
throw;
}
Or, using exception filtering available in C# 6
catch (SqlException ex) when (ex.Number == 1205)
{
// Deadlock
}
A handy thing to do to find the actual SQL error code for a given message, is to look in sys.messages in SQL Server.
e.g.
SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033
An alternative way to handle deadlocks (from SQL Server 2005 and above), is to do it within a stored procedure using the TRY…CATCH support:
BEGIN TRY
-- some sql statements
END TRY
BEGIN CATCH
IF (ERROR_NUMBER() = 1205)
-- is a deadlock
ELSE
-- is not a deadlock
END CATCH
There’s a full example here in MSDN of how to implement deadlock retry logic purely within SQL.