[Mono-dev] Unable to catch ArgumentException from constructor in lambda expression

Patrick Timm patrick at isharp.dk
Wed Feb 23 04:16:23 EST 2011


Hi

I am using the Samus MongoDB C# driver (Version 0.90.0.1) with some very
simple documents in a mod_mono application.

The following was my original code. It filters the documents in the
(typed) collection "collection" using an Oid (object ID). The
constructor for "Oid" takes a 24 character string. In the following I
supply an invalid ID string which make the Oid.ctor call throw a
System.ArgumentException. However the mod_mono runtime crashes -
bypassing my try..catch.

<failingCode>
try
{
	// delete the link document with the given ID
	collection.Remove(x => (Oid)x.Id == new Oid("invalidinput"));
}

catch (ArgumentException)
{
	// given ID has invalid length (must be 24 characters)
	return;
}
</failingCode>

Results in the following stacktrace...

<stacktrace>
System.ArgumentException: Oid strings should be 24 characters
at MongoDB.Oid.ValidateHex (string) <IL 0x0004b, 0x000d3>
at MongoDB.Oid.ParseBytes (string) <IL 0x00015, 0x00043>
at MongoDB.Oid..ctor (string) <IL 0x00020, 0x0003b>
at (wrapper dynamic-method)
System.Runtime.CompilerServices.ExecutionScope.lambda_method
(System.Runtime.CompilerServices.ExecutionScope) <IL 0x00005, 0x00039>
at (wrapper managed-to-native)
System.Reflection.MonoMethod.InternalInvoke
(object,object[],System.Exception&) <IL 0x0001c, 0x00068>
at System.Reflection.MonoMethod.Invoke
(object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) [0x000d0] in /tmp/mono/trunk/src/mono-2.6.4/mcs/class/corlib/System.Reflection/MonoMethod.cs:213
</stacktrace>

Rewriting the code to the following works as expected. The catch is run.

<workingCode>
try
{
	Oid alala = new Oid("invalidinput");
	
	// delete the link document with the given ID
	collection.Remove(x => (Oid)x.Id == alala);
}

catch (ArgumentException)
{
	return;
}
</workingCode>

Is my opinion these code snippets are functionally equal and should both
work.

Is this an error in the mono-runtime, mongo db driver or just me :o)


Kind regards

Patrick



More information about the Mono-devel-list mailing list