7

私はタイプのこの例外を持っていますSystem.AggregateException:

Message = "One or more errors occurred."
Source = null
StackTrace = null

それInnerExceptionはこれSystem.Reflection.TargetInvocationExceptionです:

Message = "Exception has been thrown by the target of an invocation."
Source = "mscorlib"
StackTrace = 
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Incoming(IHubIncomingInvokerContext context)

InnerExceptionから拡張するのは、私が作成したこの例外ですApplicationException:

Message = "Some error writen by me at the hub"
Source = "Chat"
StackTrace = 
      at Chat.Hubs.ChatHub.SendMessage(String text, String clientConnId) in d:\...Chat\Chat\Hubs\ChatHub.cs:line 48

これを実行すると:

Exception excpetion = ex.GetBaseException();

はどこですかexSystem.AggregateExceptionを取得System.Reflection.TargetInvocationExceptionexcpetionます。これはどのように起こりますか?

シナリオ

単純なプロジェクトでこれを再現する方法がわかりません。私の場合、SignalR プロジェクトでこれを見つけました。一部のハブ メソッドは例外をスローし、global.asax でこれを使用してエラーを処理します。

GlobalHost.HubPipeline.AddModule(new MyHubPipelineModule());

そしてMyHubPipelineModule、次のようにする必要があります:

public class MyHubPipelineModule : HubPipelineModule
{
    protected override void OnIncomingError(Exception ex, IHubIncomingInvokerContext context)
    {
        Exception excpetion = ex.GetBaseException();
        context.Hub.Clients.Caller.ExceptionHandler(excpetion.Message);
    }
}

注: これは SignalR 1.0.1 で行う必要があります。1.1.0 では、例外はより単純 (チェーンが小さい) であるため、うまく機能します。このパッケージのバージョンがあることを確認してください:

<package id="Microsoft.AspNet.SignalR" version="1.0.1" targetFramework="net40" />
<package id="Microsoft.AspNet.SignalR.Core" version="1.0.1" targetFramework="net40" />
<package id="Microsoft.AspNet.SignalR.JS" version="1.0.1" targetFramework="net40" />
<package id="Microsoft.AspNet.SignalR.Owin" version="1.0.1" targetFramework="net40" />
<package id="Microsoft.AspNet.SignalR.SystemWeb" version="1.0.1" targetFramework="net40" />
4

3 に答える 3

1

これは Mono のソース コードです。

public override Exception GetBaseException() {
    Exception back = this;
    AggregateException backAsAggregate = this;
    while (backAsAggregate != null && backAsAggregate.InnerExceptions.Count == 1) {
        back = back.InnerException;
        backAsAggregate = back as AggregateException;
    }
    return back;
}

これは、GetBaseException() が最上位の単純な AggregateException ラッパーを削除するだけであることを意味します。

私の意見では、例外レポートを作成する前に、この方法を常に適用する必要があります。

于 2016-06-29T10:01:43.450 に答える