O código de erro específico do Microsft SQL Server para um deadlock é 1205, portanto, você precisa lidar com o SqlException e verificar isso. Assim, por exemplo se para todos os outros tipos de SqlException você deseja que a bolha a exceção seja:
catch (SqlException ex)
{
if (ex.Number == 1205)
{
// Deadlock
}
else
throw;
}
Ou, usando a filtragem de exceção disponível em C# 6
catch (SqlException ex) when (ex.Number == 1205)
{
// Deadlock
}
Uma coisa útil a fazer para encontrar o código de erro SQL real para uma determinada mensagem é procurar em sys.messages no SQL Server.
por exemplo.
SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033
Uma maneira alternativa de lidar com deadlocks (do SQL Server 2005 e superior) é fazê-lo em um procedimento armazenado usando o suporte TRY...CATCH:
BEGIN TRY
-- some sql statements
END TRY
BEGIN CATCH
IF (ERROR_NUMBER() = 1205)
-- is a deadlock
ELSE
-- is not a deadlock
END CATCH
Há um exemplo completo aqui no MSDN de como implementar a lógica de repetição de deadlock puramente dentro do SQL.