Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions src/CsvHelper/CsvHelperException.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,19 @@ public class CsvHelperException : Exception
[NonSerialized]
private readonly CsvContext? context;

[NonSerialized]
private readonly string originalMessage = "";

/// <summary>
/// Gets the context.
/// </summary>
public CsvContext? Context => context;

/// <summary>
/// Gets the original error message, without added details.
/// </summary>
public string OriginalMessage => originalMessage;

/// <summary>
/// Initializes a new instance of the CsvHelperException class.
/// </summary>
Expand All @@ -30,14 +38,20 @@ internal protected CsvHelperException() : base() { }
/// Initializes a new instance of the CsvHelperException class.
/// </summary>
/// <param name="message">The message that describes the error.</param>
internal protected CsvHelperException(string message) : base(message) { }
internal protected CsvHelperException(string message) : base(message)
{
originalMessage = message;
}

/// <summary>
/// Initializes a new instance of the CsvHelperException class.
/// </summary>
/// <param name="message">The error message that explains the reason for the exception.</param>
/// <param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
internal protected CsvHelperException(string message, Exception innerException) : base(message, innerException) { }
internal protected CsvHelperException(string message, Exception innerException) : base(message, innerException)
{
originalMessage = message;
}

/// <summary>
/// Initializes a new instance of the <see cref="CsvHelperException"/> class.
Expand All @@ -56,11 +70,12 @@ public CsvHelperException(CsvContext context)
public CsvHelperException(CsvContext context, string message) : base(AddDetails(message, context))
{
this.context = context;
originalMessage = message;
}

/// <summary>
/// Initializes a new instance of the <see cref="CsvHelperException"/> class
/// with a specified error message and a reference to the inner exception that
/// with a specified error message and a reference to the inner exception that
/// is the cause of this exception.
/// </summary>
/// <param name="context">The context.</param>
Expand All @@ -69,6 +84,7 @@ public CsvHelperException(CsvContext context, string message) : base(AddDetails(
public CsvHelperException(CsvContext context, string message, Exception innerException) : base(AddDetails(message, context), innerException)
{
this.context = context;
originalMessage = message;
}

private static string AddDetails(string message, CsvContext context)
Expand Down
29 changes: 29 additions & 0 deletions tests/CsvHelper.Tests/CsvHelperExceptionTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Globalization;
using CsvHelper.Configuration;
using CsvHelper.Tests.Mocks;
using Xunit;

namespace CsvHelper.Tests;

public class CsvHelperExceptionTests
{
[Fact]
public void ExceptionStoresOriginalMessageInOriginalMessage()
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
};
var parser = new ParserMock(config)
{
{ "Id", "Name" }
};

var csv = new CsvReader(parser);

var error = Assert.Throws<ReaderException>(() => csv.ReadHeader());
Assert.StartsWith("Configuration.HasHeaderRecord is false.", error.Message);
Assert.NotEqual("Configuration.HasHeaderRecord is false.", error.Message);
Assert.Equal("Configuration.HasHeaderRecord is false.", error.OriginalMessage);
}
}