Fixed #11: Improve stack traces for exceptions
Fixed #12: Stack overflow when an exception occurs in the middleware
This commit is contained in:
parent
52ad9a4fc6
commit
0a9bc09884
@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Runtime.ExceptionServices;
|
||||||
using RabbitMQ.Client;
|
using RabbitMQ.Client;
|
||||||
using Tapeti.Config;
|
using Tapeti.Config;
|
||||||
using Tapeti.Helpers;
|
using Tapeti.Helpers;
|
||||||
@ -32,6 +33,7 @@ namespace Tapeti.Connection
|
|||||||
public override void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey,
|
public override void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey,
|
||||||
IBasicProperties properties, byte[] body)
|
IBasicProperties properties, byte[] body)
|
||||||
{
|
{
|
||||||
|
ExceptionDispatchInfo exception = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var message = dependencyResolver.Resolve<IMessageSerializer>().Deserialize(body, properties);
|
var message = dependencyResolver.Resolve<IMessageSerializer>().Deserialize(body, properties);
|
||||||
@ -81,20 +83,24 @@ namespace Tapeti.Connection
|
|||||||
|
|
||||||
if (!validMessageType)
|
if (!validMessageType)
|
||||||
throw new ArgumentException($"Unsupported message type: {message.GetType().FullName}");
|
throw new ArgumentException($"Unsupported message type: {message.GetType().FullName}");
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
worker.Respond(deliveryTag, exceptionStrategy.HandleException(context, UnwrapException(e)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
worker.Respond(deliveryTag, ConsumeResponse.Ack);
|
worker.Respond(deliveryTag, ConsumeResponse.Ack);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
worker.Respond(deliveryTag, exceptionStrategy.HandleException(null, UnwrapException(e)));
|
exception = ExceptionDispatchInfo.Capture(UnwrapException(e));
|
||||||
|
worker.Respond(deliveryTag, exceptionStrategy.HandleException(context, exception.SourceException));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
exception = ExceptionDispatchInfo.Capture(UnwrapException(e));
|
||||||
|
worker.Respond(deliveryTag, exceptionStrategy.HandleException(null, exception.SourceException));
|
||||||
|
}
|
||||||
|
|
||||||
|
exception?.Throw();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private static Exception UnwrapException(Exception exception)
|
private static Exception UnwrapException(Exception exception)
|
||||||
@ -103,11 +109,14 @@ namespace Tapeti.Connection
|
|||||||
// code using Tasks we have to unwrap these ourselves to get the proper
|
// code using Tasks we have to unwrap these ourselves to get the proper
|
||||||
// exception directly instead of "Errors occured". We might lose
|
// exception directly instead of "Errors occured". We might lose
|
||||||
// some stack traces in the process though.
|
// some stack traces in the process though.
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
var aggregateException = exception as AggregateException;
|
var aggregateException = exception as AggregateException;
|
||||||
if (aggregateException != null && aggregateException.InnerExceptions.Count == 1)
|
if (aggregateException == null || aggregateException.InnerExceptions.Count != 1)
|
||||||
throw aggregateException.InnerExceptions[0];
|
return exception;
|
||||||
|
|
||||||
return UnwrapException(exception);
|
exception = aggregateException.InnerExceptions[0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user