Details
-
Bug
-
Resolution: Fixed
-
Unknown
-
2.14.0
-
None
-
None
-
Minor Change
Description
Assume a program contains an error in CommandSucceededEvent event handler:
using System;
|
using MongoDB.Driver;
|
using MongoDB.Driver.Core.Events;
|
|
|
namespace MongoDbStackBug
|
{
|
class Program |
{
|
static void Main(string[] args) |
{
|
var mongoClientSettings = MongoClientSettings.FromConnectionString("mongodb://localhost:27017/test"); |
mongoClientSettings.ClusterConfigurator = cc =>
|
{
|
cc.Subscribe<CommandSucceededEvent>(cmd =>
|
{
|
Console.WriteLine($"Command duration {cmd.Duration}"); |
|
|
// NRE here |
((object)null).ToString(); |
});
|
};
|
|
|
var mongoClient = new MongoClient(mongoClientSettings); |
|
|
mongoClient.GetDatabase("test").ListCollections(); |
}
|
}
|
}
|
Actual behavior
The program throws an exception and the exception stack looks like MongoDB driver internal error
Duration 00:00:00.0091552
|
Unhandled exception. MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server.
|
---> System.NullReferenceException: Object reference not set to an instance of an object.
|
at MongoDB.Driver.Core.Connections.BinaryConnection.ReceiveMessage(Int32 responseTo, IMessageEncoderSelector encoderSelector, MessageEncoderSettings messageEncoderSettings, CancellationToken cancellationToken)
|
at MongoDB.Driver.Core.WireProtocol.CommandUsingQueryMessageWireProtocol`1.Execute(IConnection connection, CancellationToken cancellationToken)
|
at MongoDB.Driver.Core.WireProtocol.CommandWireProtocol`1.Execute(IConnection connection, CancellationToken cancellationToken)
|
at MongoDB.Driver.Core.Connections.HelloHelper.GetResult(IConnection connection, CommandWireProtocol`1 helloProtocol, CancellationToken cancellationToken)
|
at MongoDB.Driver.Core.Connections.ConnectionInitializer.SendHello(IConnection connection, CancellationToken cancellationToken)
|
(I clipped the rest of the stack)
Expected behavior
On top of the stack trace should have been a frame with my faulty code. Without that, it is hard to find if there is an error in my code.
My suggestion
I believe the stack trace is cut because of `throw ex` in this code https://github.com/mongodb/mongo-csharp-driver/blob/1123d60823c8c3fc42246282cddfecc8b76479e6/src/MongoDB.Driver.Core/Core/Connections/BinaryConnection.cs#L522 (and some other places) If an exception is not wrapped, then it should be just 'throw', without ex.