2016-03-21 18 views
-1

を処理する方法:が正しく、私は適切にタスクにいくつかの例外を処理する方法を把握しようとしていますタスク例外

メソッドの呼び出し:

Task<Branch3GInfo> getActive3GRoutersTask = 
    Task.Run(
     () => CAS.Service.GetBranch3GInformationAsync(3) 
    ); 

try 
{ 
    Task.WaitAll(discoverRouterExtendedInfoTask, getActive3GRoutersTask); 
} 
catch(AggregateException aggEx) 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append("Some problems occured on GetNodesInCriticalCondition(): \n"); 
    foreach (var ex in aggEx.InnerExceptions) 
    { 
     sb.Append(ex.Message); 
    } 

    Trace.TraceError(sb.ToString()); 
} 

var branch3gInfo = getActive3GRoutersTask.Result; 

var branch3gInfo = getActive3GRoutersTask.Result;System.Aggregate Exceptionスローします。私はGetBranch3GInformationAsync()activeRoutersExtInfosに結果を追加しませんelse句を実行しなければならないか、あるいは、それをキャッチしなければならないという前提を作っています私のコードから

public async Task<Branch3GInfo> GetBranch3GInformationAsync(int searchDepth) 
{ 
    var branch3gInfo = await GetBranch3GInterfacesAsync(); 

    var activeRoutersExtInfos = new List<CasApiRouterModelExtendedInfo>(); 
    foreach (var netInterface in branch3gInfo.Branch3GActiveInterfaces) 
    { 
     try 
     { 
      var task = GetRouterExtendedInfoFromInterfaceAsync(netInterface, searchDepth); 
      var result = await task; 

      if (task.Status == TaskStatus.RanToCompletion && result != null) 
      { 
       activeRoutersExtInfos.Add(result); 
      } 
      else 
      { 
       Trace.TraceError("Error occured trying to get info about Active 3G Router " + netInterface.ModelName + "."); 
      } 
     } 
     catch (Exception ex) 
     { 
      Trace.TraceError("Error occured trying to get info about Active 3G Router " + netInterface.ModelName + 
       ": \n" + ex.Message); 
     } 

    } 

    return new Branch3GInfo() 
    { 
     Branch3GActiveInterfaces = branch3gInfo.Branch3GActiveInterfaces, 
     Branch3GCapableInterfaces = branch3gInfo.Branch3GCapableInterfaces, 
     Branch3GActiveRouters = activeRoutersExtInfos.ToArray() 
    }; 
} 

、:法と呼ば

例外。なぜそれが私がGetBranch3GInformationAsync()でこれを処理していた場合に呼び出すメソッドがSystem.AggregateExceptionをスローすることですか?

例外のために失敗したGetRouterExtendedInfoFromInterfaceAsync()への呼び出しが無視され、コードが壊れないようにするにはどうすればこの問題を解決できますか?

UPDATE:

at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization) 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
at CASpectrumApi.CasApiRestCall.<ExecuteAsync>d__38.MoveNext() in C:\src\CASpectrumApi\src\CASpectrumApi\Queries\CasApiRestCall.cs:line 294 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
at CASpectrumApi.Managers.CasApiServiceManager.<RenderAndExecuteRestCallAsync>d__103.MoveNext() in C:\src\CASpectrumApi\src\CASpectrumApi\Managers\CasApiServiceManager.cs:line 2516 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
at CASpectrumApi.Managers.CasApiServiceManager.<QueryModelsFilterByAttributeNotDeviceOnlyAsync>d__51.MoveNext() in C:\src\CASpectrumApi\src\CASpectrumApi\Managers\CasApiServiceManager.cs:line 1196 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
at CASpectrumApi.Managers.CasApiServiceManager.<GetBranch3GInterfacesAsync>d__34.MoveNext() in C:\src\CASpectrumApi\src\CASpectrumApi\Managers\CasApiServiceManager.cs:line 442 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
at CASpectrumApi.Managers.CasApiServiceManager.<GetBranch3GInformationAsync>d__26.MoveNext() in C:\src\CASpectrumApi\src\CASpectrumApi\Managers\CasApiServiceManager.cs:line 246 
+0

あなたが見ている 'AggregateException'の例外の詳細は何ですか? –

+0

あなたのメソッドはすべての例外を処理しているわけではありません。 'branch3gInfo'がnullであると言います。あなたはNREを取得し、呼び出し元のメソッドに伝播します。詳細については、 'AggregateException.InnerExceptions'プロパティを参照してください。 –

+0

@StephenClearyこれは、HTTP呼び出しがHTTP 500(内部サーバーエラー)を返したことを示す1つのInnerExceptionを含みます。私はスタックトレースの質問を更新しました。 – blgrnboy

答えて

3

あなたはあなたのコールスタックから見ることができます:

System.AggregateExceptionInnerException( "(500)内部サーバーエラーリモートサーバーがエラーを返しました")のための スタックトレースそれが失敗している GetBranch3GInterfacesAsyncへの呼び出しではなく、 GetRouterExtendedInfoFromInterfaceAsyncへの呼び出しであることを
at CASpectrumApi.Managers.CasApiServiceManager.<GetBranch3GInterfacesAsync>d__34.MoveNext() 

GetBranch3GInterfacesAsyncはブロックtryの外側で呼び出されるため、当然例外が伝播します。

+0

呼び出すメソッドでtry/catchするべきではない 'try { Task.WaitAll(discoverRouterExtendedInfoTask、getActive3GRoutersTask); } ' 例外をキャッチして世話をしますか? – blgrnboy

+0

@blgrnboy:そこに上げられ、 'getActive3GRoutersTask.Result'を呼び出すと再び呼び出されます。 –

関連する問題