diff --git a/src/Ydb.Sdk/CHANGELOG.md b/src/Ydb.Sdk/CHANGELOG.md index 49eacc7f..42738df7 100644 --- a/src/Ydb.Sdk/CHANGELOG.md +++ b/src/Ydb.Sdk/CHANGELOG.md @@ -1,3 +1,5 @@ +- Fixed YdbException: propagate inner exception. + ## v0.18.1 - Fixed bug: 'System.DateOnly' is not supported by YdbParameter ([#449](https://github.com/ydb-platform/ydb-dotnet-sdk/issues/449)). diff --git a/src/Ydb.Sdk/src/Ado/YdbConnection.cs b/src/Ydb.Sdk/src/Ado/YdbConnection.cs index 71a25a9d..4fd8e6d5 100644 --- a/src/Ydb.Sdk/src/Ado/YdbConnection.cs +++ b/src/Ydb.Sdk/src/Ado/YdbConnection.cs @@ -100,7 +100,7 @@ public override async Task OpenAsync(CancellationToken cancellationToken) { throw e switch { - Driver.TransportException transportException => new YdbException(transportException.Status), + Driver.TransportException transportException => new YdbException(transportException), StatusUnsuccessfulException unsuccessfulException => new YdbException(unsuccessfulException.Status), _ => e }; diff --git a/src/Ydb.Sdk/src/Ado/YdbDataReader.cs b/src/Ydb.Sdk/src/Ado/YdbDataReader.cs index 05ac025d..9898b173 100644 --- a/src/Ydb.Sdk/src/Ado/YdbDataReader.cs +++ b/src/Ydb.Sdk/src/Ado/YdbDataReader.cs @@ -596,7 +596,7 @@ private async ValueTask NextExecPart() _onNotSuccessStatus(e.Status); - throw new YdbException(e.Status); + throw new YdbException(e); } } diff --git a/src/Ydb.Sdk/src/Ado/YdbException.cs b/src/Ydb.Sdk/src/Ado/YdbException.cs index 00a0ed3c..d8655eea 100644 --- a/src/Ydb.Sdk/src/Ado/YdbException.cs +++ b/src/Ydb.Sdk/src/Ado/YdbException.cs @@ -4,15 +4,17 @@ namespace Ydb.Sdk.Ado; public class YdbException : DbException { - public YdbException(string message) : base(message) + internal YdbException(string message) : base(message) { } - public YdbException(string message, Exception e) : base(message, e) + internal YdbException(Driver.TransportException transportException) + : this(transportException.Status, transportException) { } - public YdbException(Status status) : base(status.ToString()) + internal YdbException(Status status, Exception? innerException = null) + : base(status.ToString(), innerException) { Code = status.StatusCode; var policy = RetrySettings.DefaultInstance.GetRetryRule(status.StatusCode).Policy; diff --git a/src/Ydb.Sdk/src/Ado/YdbSchema.cs b/src/Ydb.Sdk/src/Ado/YdbSchema.cs index 402eb571..95879746 100644 --- a/src/Ydb.Sdk/src/Ado/YdbSchema.cs +++ b/src/Ydb.Sdk/src/Ado/YdbSchema.cs @@ -40,7 +40,7 @@ internal static Task GetSchemaAsync( }; } - internal static Task> SchemaObjects( + private static Task> SchemaObjects( YdbConnection ydbConnection, CancellationToken cancellationToken = default ) @@ -50,7 +50,7 @@ internal static Task> SchemaObjects( return SchemaObjects(ydbConnection, WithSuffix(database), database, cancellationToken); } - internal static async Task DescribeTable( + private static async Task DescribeTable( YdbConnection ydbConnection, string tableName, DescribeTableSettings? describeTableSettings = null @@ -78,7 +78,7 @@ internal static async Task DescribeTable( { ydbConnection.OnStatus(e.Status); - throw new YdbException("Transport error on DescribeTable", e); + throw new YdbException(e); } } @@ -461,7 +461,7 @@ await SchemaObjects( } catch (Driver.TransportException e) { - throw new YdbException("Transport error on ListDirectory", e); + throw new YdbException(e); } } diff --git a/src/Ydb.Sdk/src/Ado/YdbTransaction.cs b/src/Ydb.Sdk/src/Ado/YdbTransaction.cs index 6765b8d1..d7162c55 100644 --- a/src/Ydb.Sdk/src/Ado/YdbTransaction.cs +++ b/src/Ydb.Sdk/src/Ado/YdbTransaction.cs @@ -110,7 +110,7 @@ private async Task FinishTransaction(Func> finishMethod) DbConnection.OnStatus(e.Status); - throw new YdbException(e.Status); + throw new YdbException(e); } finally { diff --git a/src/Ydb.Sdk/src/Driver.cs b/src/Ydb.Sdk/src/Driver.cs index dc8789e5..4af6609b 100644 --- a/src/Ydb.Sdk/src/Driver.cs +++ b/src/Ydb.Sdk/src/Driver.cs @@ -185,7 +185,7 @@ internal InitializationFailureException(string message) : base(message) public class TransportException : IOException { - internal TransportException(RpcException e) : base($"Transport exception: {e.Message}", e) + internal TransportException(RpcException e) : base("Transport RPC call error", e) { Status = e.Status.ConvertStatus(); } diff --git a/src/Ydb.Sdk/tests/Ado/YdbExceptionTests.cs b/src/Ydb.Sdk/tests/Ado/YdbExceptionTests.cs index f77284bd..0afa7f79 100644 --- a/src/Ydb.Sdk/tests/Ado/YdbExceptionTests.cs +++ b/src/Ydb.Sdk/tests/Ado/YdbExceptionTests.cs @@ -50,11 +50,11 @@ public async Task IsTransient_WhenAborted_ReturnTrueAndMakeEmptyRollback() ydbCommand.CommandText = $"UPDATE {bankTable} SET amount = amount + @var WHERE id = 1"; ydbCommand.Parameters.AddWithValue("var", DbType.Int32, select); - Assert.True(Assert.Throws(() => + Assert.True((await Assert.ThrowsAsync(async () => { - ydbCommand.ExecuteNonQuery(); - ydbCommand.Transaction.Commit(); - }).IsTransient); + await ydbCommand.ExecuteNonQueryAsync(); + await ydbCommand.Transaction.CommitAsync(); + })).IsTransient); await new YdbCommand(anotherConnection) { CommandText = $"DROP TABLE {bankTable}"