다음과 같은 구현이 있습니다.
Task<IEnumerable<Item1>> GetItems1()
{
return RunRequest(async () => ParseItemsFromResponse(await(httpClient.Get(..))));
}
Task<IEnumerable<Item2>> GetItems2()
{
return RunRequest(async () => ParseItemsFromResponse(await httpClient.Get(..)));
}
TResult RunRequest<TResult>(Func<TResult> req)
{
try
{
return req();
}
catch (Exception ex)
{
// Parse exception here and throw custom exceptions
}
}
문제는 익명의 무효 메서드입니다.async () => ParseItemsFromResponse(..)
.
그것은 무효가 아니기 때문에Task
익명 메소드 내에서 예외가 발생하면 실제로는 catch되지 않습니다.try
과catch
내RunRequest
.
어떤 제안이 이것을 리팩토링하는 방법?
RunRequest
~해야한다.Func<Task<TResult>>
, 같은 :
async Task<TResult> RunRequestAsync<TResult>(Func<Task<TResult>> req)
{
try
{
return await req().ConfigureAwait(false);
}
catch (Exception ex)
{
// Parse exception here and throw custom exceptions
}
}
그럼 너의async
람다는async Task<T>
대신에 방법async void
.
에 대한 자세한 정보가 있습니다.싱크 / 비동기 대의원내 블로그에.
ConfigureAwait(false)
? 아니면 컨텍스트를 다시 전환하지 않는 최적화입니까? - Don Box
async void
. 이벤트 핸들러 또는 이와 유사한 메소드를 수신하거나 처리 할 수없는 메소드에만 해당됩니다.Task
결과. 님이 던진 예외는 없습니다.async void
응용 프로그램의 처리되지 않은 예외 처리기를 제외하고 - Panagiotis KanavosRunRequest
~을 취하다Task
대신에Func
그리고httpClient.Get()
직접? - Mats391RunRequest
ParseItemsFromResponse가 뭔가를 반환하지 않으면 오버로드됩니다. 당신은 다른 것을 가지고 있습니까?Action
? 이런 식으로하지 마십시오.var result=await httpClient.Get();ParseItems(result);
깨끗하다. - Panagiotis Kanavos