S>1. К сожалению, в дотнете нет способа перевыбросить исключение, не исказив его стек. Поэтому вариантов для конкретного фрагмента, в общем-то, нет.
static void Rethrow(Exception ex)
{
if (ex == null)
{
return;
}
if (ex.GetType().IsSerializable)
{
BinaryFormatter formatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.CrossAppDomain));
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, ex);
stream.Position = 0;
throw (Exception)formatter.Deserialize(stream);
}
FieldInfo remoteStackTraceString = typeof(Exception).GetField("_remoteStackTraceString", BindingFlags.Instance | BindingFlags.NonPublic);
remoteStackTraceString.SetValue(ex, ex.StackTrace + Environment.NewLine);
throw ex;
}