Best way to check for inner exception?

后端 未结 14 2296
说谎
说谎 2020-12-02 11:57

I know sometimes innerException is null

So the following might fail:

 repEvent.InnerException = ex.InnerException.Message; 

Is ther

14条回答
  •  抹茶落季
    2020-12-02 12:27

    Here is another possible implementation that appends the messages and stack traces so we get them full:

    private static Tuple GetFullExceptionMessageAndStackTrace(Exception exception)
    {
        if (exception.InnerException == null)
        {
            if (exception.GetType() != typeof(ArgumentException))
            {
                return new Tuple(exception.Message, exception.StackTrace);
            }
            string argumentName = ((ArgumentException)exception).ParamName;
            return new Tuple(String.Format("{0} With null argument named '{1}'.", exception.Message, argumentName ), exception.StackTrace);
        }
        Tuple innerExceptionInfo = GetFullExceptionMessageAndStackTrace(exception.InnerException);
        return new Tuple(
        String.Format("{0}{1}{2}", innerExceptionInfo.Item1, Environment.NewLine, exception.Message),
        String.Format("{0}{1}{2}", innerExceptionInfo.Item2, Environment.NewLine, exception.StackTrace));
    }
    
    
    [Fact]
    public void RecursiveExtractingOfExceptionInformationOk()
    {
        // Arrange
        Exception executionException = null;
        var iExLevelTwo = new NullReferenceException("The test parameter is null");
        var iExLevelOne = new ArgumentException("Some test meesage", "myStringParamName", iExLevelTwo);
        var ex = new Exception("Some higher level message",iExLevelOne);
    
        // Act 
        var exMsgAndStackTrace = new Tuple("none","none");
        try
        {
            exMsgAndStackTrace = GetFullExceptionMessageAndStackTrace(ex);
        }
        catch (Exception exception)
        {
            executionException = exception;
        }
    
        // Assert
        Assert.Null(executionException);
    
        Assert.True(exMsgAndStackTrace.Item1.Contains("The test parameter is null"));
        Assert.True(exMsgAndStackTrace.Item1.Contains("Some test meesage"));
        Assert.True(exMsgAndStackTrace.Item1.Contains("Some higher level message"));
        Assert.True(exMsgAndStackTrace.Item1.Contains("myStringParamName"));
    
        Assert.True(!string.IsNullOrEmpty(exMsgAndStackTrace.Item2));
    
        Console.WriteLine(exMsgAndStackTrace.Item1);
        Console.WriteLine(exMsgAndStackTrace.Item2);
    }
    

提交回复
热议问题