Обычно способ сделать это - определить константы ошибок в вашем .Net-коде, а затем вы можете проверить значение в вашем коде обработки исключений. Вы можете использовать константы, чтобы сделать код более читабельным, примерно так:
/// <summary>
/// Represents the error code returned from stored procedure when entity could not be found.
/// </summary>
private const int SQL_ERROR_CODE_ENTITY_NOT_FOUND = 50001;
/// <summary>
/// Represents the error code returned from stored procedure when entity to be updated has time mismatch.
/// </summary>
private const int SQL_ERROR_CODE_TIME_MISMATCH = 50002;
/// <summary>
/// Represents the error code returned from stored procedure when a persistence exception occurs (ex.
/// billing flag is invalid, child records exist which prevent a delete, etc.).
/// </summary>
private const int SQL_ERROR_CODE_PERSISTENCE_ERROR = 50003;
Затем вы можете обрабатывать подобные исключения, и это делает ваш код намного более читабельным и обслуживаемым:
if (e.InnerException is SqlException)
{
// verify exception code from SP and throw proper exception if required
var sqlException = (SqlException)e.InnerException;
if (sqlException.Number == SQL_ERROR_CODE_ENTITY_NOT_FOUND)
{
e = new EntityNotFoundException(e.Message, e);
}
else if (sqlException.Number == SQL_ERROR_CODE_TIME_MISMATCH)
{
e = new EntityTimestampMismatchException(e.Message, e);
}
else if (sqlException.Number == SQL_ERROR_CODE_PERSISTENCE_ERROR)
{
e = new EntityServicePersistenceException(e.Message, e);
}
}
На мой взгляд, это примерно так же чисто, как вы можете сделать это, но все равно нормально, потому что вы определяете коды ошибок в одном месте, поэтому, если что-то когда-либо изменится, вы просто измените одну константу.
И чтобы поднять ошибку, вы можете сделать что-то подобное в T-SQL:
-- record wasn't found, raise an error
DECLARE @l_error NVARCHAR(1000)
SET @l_error = 'Record with ' + @p_IdFieldName + ' = ' + CONVERT(VARCHAR(128), @p_id)
+ ' does not exist in table [' + @p_TableName + ']'
EXEC sp_addmessage @msgnum=50001, @severity=16, @msgtext=@l_error, @replace='replace'
RAISERROR(50001, 16, 1)
50001 представляет номер ошибки, который будет в SqlException.Number
.