Обновление сообщения в CustomException

У меня есть веб-приложение ASP MVC, и я пытаюсь настроить ведение журнала ошибок, где я пытаюсь отобразить дружественное к пользовательскому интерфейсу сообщение для Интернета и зарегистрировать более подробное сообщение в необходимой базе данных. Моему приложению может не потребоваться всегда регистрировать сообщение об ошибке в БД, но я хотел настроить пользовательское исключение таким образом, чтобы оно обрабатывало оба сценария.

  1. Показать короткое дружественное к пользовательскому интерфейсу сообщение и подробное сообщение об ошибке журнала в БД
  2. Показать короткое дружественное к пользовательскому интерфейсу сообщение без входа в БД.

Вот что у меня есть: CustomException: если подробное сообщение передано, получите новый guid, зарегистрируйте сообщение в БД и объедините значение guid в shortMessage.

public class CustomException : Exception
{
    public CustomException(string message) : base(message)
    {
    }

    public CustomException(string shortMessage, string detailMessage = "") : base(shortMessage)
    {
        if (!string.IsNullOrWhiteSpace(detailMessage))
        {          
            string loggingId = Guid.NewGuid().ToString();
            //code to log in DB with detail message
            shortMessage = $"Reference# : {loggingId}. {shortMessage}";
        }
    }        
}

Вспомогательный метод ThrowIf для проверки значения, чтобы код был чище, и мне не нужно делать проверку блока, как старую школу в веб-слое.

public static class ThrowIf
{
    public static void IsZeroOrNegative(int argument, string shortMessage, string detailMessage = "")
    {
        if (argument <= 0)
        {
            throw new CustomException(shortMessage, detailMessage);         
        }
    }

    public static void IsNull(object argument, string shortMessage, string detailMessage = "")
    {
        if (argument == null)
        {
            throw CustomException.LogMessage(shortMessage, detailMessage);
        }
    }
}

Код веб-уровня: (пожалуйста, не спрашивайте, почему я не выбрасываю ArgumentException и не использую собственное CustomException в этом сценарии)

public ActionResult GetEmployee(int employeeId)
{
    var responseViewModel = new EmployeeModel();
    try
    {
        ThrowIf.IsZeroOrNegative(employeeId, shortMessage: "This is short message for UI.", detailMessage: "This is detail message for DB");
    }
    catch(CustomException ex)
    {
        ViewBag.Error = ex.Message();
    }
    return View(responseViewModel);
}

Проблема: Как вы можете видеть в моем коде CustomException, если я передаю значение для 'detailMessage', оно обновляет shortMessage текстом 'Reference..'. Теперь в веб-коде всякий раз, когда возникает ошибка, текст для ex.Message() не содержит текста «Ссылка...» и показывает только «Это короткое сообщение для пользовательского интерфейса» вместо «Ссылка#: [значение guid] . Это короткое сообщение для пользовательского интерфейса.

Кто-нибудь знает, почему ex.Message не отображает обновленный текст, когда ошибка возникает на веб-слое?

вы присваиваете значение переменной shortMessage в конструкторе. и ожидание, что свойство Message класса Exception будет иметь значение shortmessage

Matt.G 28.02.2019 22:05

Вы можете присвоить значение короткого сообщения частной переменной в классе и переопределить свойство сообщения, чтобы оно возвращало значение частной переменной.

Matt.G 28.02.2019 22:12

@Matt.G лол .. такая глупая ошибка. спасибо, теперь я заработал, используя приватную переменную. :)

sanjeev 28.02.2019 22:22

@ Matt.G Я думаю, что использование частной переменной имеет один недостаток. поскольку его нужно передать в базу, он должен быть статическим. И когда происходит первая ошибка, он не возвращает фактическое сообщение об ошибке, другие вызовы после этого работают нормально. частная статическая строка _errorMessage = string.Empty; public CustomException(string shortMessage, string detailMessage = "") : base(_errorMessage) {_errorMessage = ....} я думаю, что вместо того, чтобы присваивать значение частной переменной, присваивание значения новому строковому свойству и доступ к этому свойству работали лучше.

sanjeev 01.03.2019 14:24

поскольку вы переопределяете свойство Message, вам не нужно передавать значение конструктору базового класса.

Matt.G 01.03.2019 14:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
27
0

Другие вопросы по теме