using System; using System.Globalization; namespace MTWorkHR.Core.Global { public class AppException : Exception { /// <summary> /// Gets the error number associated with this exception. /// </summary> public readonly ExceptionEnum ErrorNumber; /// <summary> /// Gets the formatted error message. /// </summary> public string ErrorMessage { get; private set; } = string.Empty; public AppException(string errorMessage) : base(errorMessage) { ErrorMessage = errorMessage; } /// <summary> /// Creates a new instance of <see cref="AppException"/> using an error number, language, and optional format arguments. /// </summary> /// <param name="errorNumber">The error number (enum) representing the exception type.</param> /// <param name="language">The language code (e.g., "en" or "ar").</param> /// <param name="args">Optional arguments to format the error message.</param> public AppException(ExceptionEnum errorNumber, params object[] args) : base() { ErrorNumber = errorNumber; ErrorMessage = GetMessage(errorNumber, GlobalInfo.lang?? "en", args); // Initialize the base exception with the localized error message. this.SetErrorMessage(); } /// <summary> /// Sets the exception message for the base exception class. /// </summary> private void SetErrorMessage() { base.HelpLink = ErrorNumber.ToString(); // Optional: Use error number as a link or reference base.Source = nameof(AppException); // Optional: Set the exception source } /// <summary> /// Retrieves the error message based on the provided error code and language. /// </summary> /// <param name="code">The error number (enum).</param> /// <param name="language">The language code (default: "en").</param> /// <param name="args">Optional parameters for formatting the message.</param> /// <returns>The localized error message.</returns> public static string GetMessage(ExceptionEnum code, string language = "en", params object[] args) { if (AppExceptions.ExceptionMessages.TryGetValue(code, out var translations) && translations.TryGetValue(language, out var message)) { try { return string.Format(CultureInfo.InvariantCulture, message, args); } catch (FormatException) { return language == "ar" ? "فشل في تنسيق الرسالة." : "Message formatting failed."; } } // Default fallback return language == "ar" ? "رسالة الخطأ غير موجودة." : "Error message not found."; } public override string ToString() { return $"{base.ToString()}\nError Number: {ErrorNumber}\nError Message: {ErrorMessage}"; } } }