2016-03-21 8 views
-1

nasıl baş edilir:düzgün düzgün bir Görev bazı istisnalar işlemek için nasıl anlamaya çalışıyorum Görev İstisna

yöntemi çağırma:

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; bir System.Aggregate Exception atar.

Aranan yöntemi: kodumu itibaren

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() 
    }; 
} 

, ben GetBranch3GInformationAsync() olmalıdır varsayım yapma ya activeRoutersExtInfos sonucu eklemez else maddesini yürütülmesi, OR, bu alıcı olmalıdır am istisna. Neden bu yöntem System.AggregateException'u GetBranch3GInformationAsync()'da ele alırsam atar?

Bir özel durum nedeniyle başarısız olan GetRouterExtendedInfoFromInterfaceAsync() numaralı çağrının yok sayılması ve kodumu kırmaması için bu sorunu gidermek üzere nasıl giderim?

GÜNCELLEME:

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

Gördüğünüz "AggregateException" özel durum ayrıntıları nedir? –

+0

Yönteminiz, tüm istisnaları ele almıyor. Branch3gInfo'nın boş olduğunu söyleyelim. Daha sonra çağrı yöntemine yayılan NRE alırsınız. Daha fazla ayrıntı için 'AggregateException.InnerExceptions' özelliğine bakın. –

+0

@StephenCleary Bir HTTP çağrısının HTTP 500 (Dahili Sunucu Hatası) döndürdüğünü belirten bir InnerException içerir. Soruyu yığın izini güncelledim. – blgrnboy

cevap

3

Sen çağrı yığınından görebilirsiniz:

: System.AggregateException içinde InnerException ("(500) İç Sunucu Hatası Uzak sunucu hata döndürdü") için Yığın izleme

, GetBranch3GInterfacesAsync numaralı çağrıdır, bu başarısız demektir, GetRouterExtendedInfoFromInterfaceAsync numaralı çağrıya değil. GetBranch3GInterfacesAsync, try bloğunun dışından çağrılır, dolayısıyla istisna, doğal olarak yayılır.

+0

Çağıran yönteme "try " deneyin { Task.WaitAll (DiscoverRouterExtendedInfoTask, getActive3GRoutersTask); } ' İstisnaı yakalamakla ilgilenin mi? – blgrnboy

+0

@blgrnboy: Orada yükseltilecek ve "getActive3GRoutersTask.Result" ifadesini çağırırsanız yeniden yükseltilecek. –

İlgili konular