Извлечение последнего внутреннего сообщения из объекта исключения C # с использованием рекурсивных методов - PullRequest
0 голосов
/ 09 октября 2019

Я хочу получить последнее внутреннее exception сообщение, используя рекурсивный вызов Требование здесь заключается в использовании рекурсивной функции. Я пытаюсь сделать это, но я думаю, что есть какая-то небольшая проблема . Вот мой код

    public static string GetFirstOccuredExceptionMessage(Exception ex)
    {
        string message ="";

        if (ex != null)
        {            
            if (ex.InnerException == null)
            {
                message  = "";
            }
            else
            {
              message = GetFirstOccuredExceptionMessage(ex.InnerException);
            }
        }

        return message; 
    }

Я постоянно получаю пустую строку , когда ожидаю, что какое-либо сообщение будет возвращено, если ex != null

Ответы [ 3 ]

5 голосов
/ 09 октября 2019

Вы всегда возвращаете пустую строку - пожалуйста, обратите внимание abscence of ex.Message. Примерно так:

public static string GetFirstOccuredExceptionMessage(Exception ex) {
  if (null == ex)                     // no exception -
    return "";                        //   we return an empty string
  else if (null == ex.InnerException) // exception with no inner one - 
    return ex.Message;                //   time to return the message
  else                                // exception which has deeper one - 
    return GetFirstOccuredExceptionMessage(ex.InnerException); // level down
}

Или оператор Turnary

public static string GetFirstOccuredExceptionMessage(Exception ex) =>
   ex == null                ? "" 
 : ex.InnerException == null ? ex.Message 
 : GetFirstOccuredExceptionMessage(ex.InnerException);
4 голосов
/ 09 октября 2019

Я изменил ваш код, вам не нужно устанавливать сообщение пустым, пока вы проверяете ex.InnerException == null, просто верните сообщение, либо оно пустое, либо нет.

    public static string GetFirstOccuredExceptionMessage(Exception ex)
    {
        string message ="";

        if (ex != null)
        {            
            if (ex.InnerException == null)
            {
                return ex.Message;
            }
            else
            {
              return  GetFirstOccuredExceptionMessage(ex.InnerException);
            }

        }

        return ""; 
    }
0 голосов
/ 09 октября 2019

Попробуйте:

public static void Main()
{
  var e = new Exception("a1", new Exception("a2", new Exception("a3", new Exception("a4", new Exception("a5")))));
  var mostInner = GetMostInnerEx(e);
}

public static Exception GetMostInnerEx(Exception ex)
{
  if (ex == null) return null;
  // Just check if inner excepiton is null, if so, do recursive call to this function with inner exception
  // When inner excepiton is null, return current exception
  return ex.InnerException == null ? ex : GetMostInnerEx(ex.InnerException);
}
...