using System; using System.Collections.Generic; namespace Sarand.Net.Standard.Base.Utils { //======================================================================= public static class ExceptionUtil { //------------------------------------------------------------------- /// /// Extract and cleanse exception message. /// - \r\n replaced with \n /// - Duplicate lines removed. /// public static String GetMessage(this Exception exc) { List messageLines = new List(); foreach (String messageLine in (StringUtil.EmptyOnNull(exc?.Message) ?? "").Trim().ReplaceAll("\r\n", "\n").Split('\n')) { if (!messageLines.ContainsCI(messageLine)) messageLines.Add(messageLine); } return messageLines.Concat("\n"); } //------------------------------------------------------------------- /// /// Generate standard exception log message. /// [ExceptionType]: [ExceptionMessage] /// followed by stack entries on separate lines. /// public static String GetErrorStateMessage(this Exception exc, bool includeExceptionType = true) { return (includeExceptionType ? exc.GetType().Name + ": " : "") + GetMessage(exc); } //------------------------------------------------------------------- /// /// Generate standard exception log message. /// [ExceptionType]: [ExceptionMessage] /// followed by stack entries on separate lines. /// public static String GetLogMessage(this Exception exc, int entries = 8, String stackEntryDelim = "\n\t") { return exc.GetLogMessage("", entries, stackEntryDelim); } /// /// Generate standard exception log message. /// [ExceptionType] [message]: [ExceptionMessage] /// followed by stack entries on separate lines. /// public static String GetLogMessage(this Exception exc, String message, int entries = 8, String stackEntryDelim = "\n\t") { return (exc.GetType().Name + " " + message + ": " + GetMessage(exc) + exc.GetStackEntries(entries).Concat("", stackEntryDelim)).TrimAll(); } //------------------------------------------------------------------- /// Retrieve stack entries, up to maximum number. public static List GetStackEntries(this Exception exc, int entries = 0) { List stackEntries = new List(); if (exc.StackTrace != null) { stackEntries.AddRange(exc.StackTrace.Split(new String[] { "\r\n" }, (entries > 0 ? entries : 999), StringSplitOptions.None)); for (int idx = 0; idx < stackEntries.Count; idx++) stackEntries[idx] = stackEntries[idx].Replace(" at ", ""); } return stackEntries; } //------------------------------------------------------------------- } //======================================================================= // File handling exceptions. public class FileException : Exception { public FileException(string message) : base(message) { } } public class ArchiveFileException : FileException { public ArchiveFileException(string message) : base(message) { } } public class FileExistsException : FileException { public FileExistsException(string message) : base(message) { } } //======================================================================= }