পুরো ব্যতিক্রমটিকে স্ট্রিংয়ে রূপান্তর করা
কল করা Exception.ToString()
আপনাকে কেবল Exception.Message
সম্পত্তি ব্যবহারের চেয়ে আরও বেশি তথ্য দেয় । যাইহোক, এটি এখনও এখনও প্রচুর তথ্য ফেলে দেয়:
Data
সংগ্রহে সম্পত্তি সব ব্যতিক্রম পাওয়া যায় নি।
- ব্যতিক্রম যুক্ত অন্য কোনও কাস্টম বৈশিষ্ট্য।
এমন অনেক সময় আছে যখন আপনি এই অতিরিক্ত তথ্য ক্যাপচার করতে চান। নীচের কোডটি উপরের পরিস্থিতিতে পরিচালনা করে। এটি একটি সুন্দর ক্রমে ব্যতিক্রমগুলির বৈশিষ্ট্যগুলিও লিখে দেয়। এটি সি # 7 ব্যবহার করছে তবে প্রয়োজনে পুরানো সংস্করণে রূপান্তর করা আপনার পক্ষে খুব সহজ হওয়া উচিত। আরও দেখুন এই সংশ্লিষ্ট উত্তর।
public static class ExceptionExtensions
{
public static string ToDetailedString(this Exception exception) =>
ToDetailedString(exception, ExceptionOptions.Default);
public static string ToDetailedString(this Exception exception, ExceptionOptions options)
{
if (exception == null)
{
throw new ArgumentNullException(nameof(exception));
}
var stringBuilder = new StringBuilder();
AppendValue(stringBuilder, "Type", exception.GetType().FullName, options);
foreach (PropertyInfo property in exception
.GetType()
.GetProperties()
.OrderByDescending(x => string.Equals(x.Name, nameof(exception.Message), StringComparison.Ordinal))
.ThenByDescending(x => string.Equals(x.Name, nameof(exception.Source), StringComparison.Ordinal))
.ThenBy(x => string.Equals(x.Name, nameof(exception.InnerException), StringComparison.Ordinal))
.ThenBy(x => string.Equals(x.Name, nameof(AggregateException.InnerExceptions), StringComparison.Ordinal)))
{
var value = property.GetValue(exception, null);
if (value == null && options.OmitNullProperties)
{
if (options.OmitNullProperties)
{
continue;
}
else
{
value = string.Empty;
}
}
AppendValue(stringBuilder, property.Name, value, options);
}
return stringBuilder.ToString().TrimEnd('\r', '\n');
}
private static void AppendCollection(
StringBuilder stringBuilder,
string propertyName,
IEnumerable collection,
ExceptionOptions options)
{
stringBuilder.AppendLine($"{options.Indent}{propertyName} =");
var innerOptions = new ExceptionOptions(options, options.CurrentIndentLevel + 1);
var i = 0;
foreach (var item in collection)
{
var innerPropertyName = $"[{i}]";
if (item is Exception)
{
var innerException = (Exception)item;
AppendException(
stringBuilder,
innerPropertyName,
innerException,
innerOptions);
}
else
{
AppendValue(
stringBuilder,
innerPropertyName,
item,
innerOptions);
}
++i;
}
}
private static void AppendException(
StringBuilder stringBuilder,
string propertyName,
Exception exception,
ExceptionOptions options)
{
var innerExceptionString = ToDetailedString(
exception,
new ExceptionOptions(options, options.CurrentIndentLevel + 1));
stringBuilder.AppendLine($"{options.Indent}{propertyName} =");
stringBuilder.AppendLine(innerExceptionString);
}
private static string IndentString(string value, ExceptionOptions options)
{
return value.Replace(Environment.NewLine, Environment.NewLine + options.Indent);
}
private static void AppendValue(
StringBuilder stringBuilder,
string propertyName,
object value,
ExceptionOptions options)
{
if (value is DictionaryEntry)
{
DictionaryEntry dictionaryEntry = (DictionaryEntry)value;
stringBuilder.AppendLine($"{options.Indent}{propertyName} = {dictionaryEntry.Key} : {dictionaryEntry.Value}");
}
else if (value is Exception)
{
var innerException = (Exception)value;
AppendException(
stringBuilder,
propertyName,
innerException,
options);
}
else if (value is IEnumerable && !(value is string))
{
var collection = (IEnumerable)value;
if (collection.GetEnumerator().MoveNext())
{
AppendCollection(
stringBuilder,
propertyName,
collection,
options);
}
}
else
{
stringBuilder.AppendLine($"{options.Indent}{propertyName} = {value}");
}
}
}
public struct ExceptionOptions
{
public static readonly ExceptionOptions Default = new ExceptionOptions()
{
CurrentIndentLevel = 0,
IndentSpaces = 4,
OmitNullProperties = true
};
internal ExceptionOptions(ExceptionOptions options, int currentIndent)
{
this.CurrentIndentLevel = currentIndent;
this.IndentSpaces = options.IndentSpaces;
this.OmitNullProperties = options.OmitNullProperties;
}
internal string Indent { get { return new string(' ', this.IndentSpaces * this.CurrentIndentLevel); } }
internal int CurrentIndentLevel { get; set; }
public int IndentSpaces { get; set; }
public bool OmitNullProperties { get; set; }
}
শীর্ষ টিপ - লগিং ব্যতিক্রম
লগিংয়ের জন্য বেশিরভাগ লোক এই কোডটি ব্যবহার করবে। আমার সেরিলোগের সাথে সেরিলোগ ব্যবহার করার কথা বিবেচনা করুন x ব্যতিক্রমগুলি নুগেট প্যাকেজ যা কোনও ব্যতিক্রমের সমস্ত বৈশিষ্ট্য লগ করে তবে বেশিরভাগ ক্ষেত্রেই এটি দ্রুত এবং প্রতিফলন ছাড়াই করে does সেরিলোগ হ'ল একটি উন্নত লগিং ফ্রেমওয়ার্ক যা লেখার সময় সমস্ত ক্রোধ।
শীর্ষ টিপ - মানব পাঠযোগ্য স্ট্যাক ট্রেস ces
আপনি ব্যবহার করতে পারেন Ben.Demystifier NuGet প্যাকেজ আপনার ব্যতিক্রম বা মানব পাঠযোগ্য স্ট্যাক ট্রেস পেতে serilog-enrichers-demystify NuGet প্যাকেজ যদি আপনি Serilog ব্যবহার করছেন।