2017-04-16 102 views
0

我有2種方法,用不同的參數:2方法與不同的參數和例外

await ocr.GetTextAsync(dataStream, filename, language); 

await ocr.GetTextAsync(fileUrl, language); 

這兩種方法都可以返回例外的相同的列表。因此,如下所示的塊:

  try 
      { 
       ocrResult = await ocr.GetTextAsync(dataStream, filename, language); 
      } 
      catch (FailedToProcessException failedEx) 
      { 
       _logger.AddLog("OCRController->GetTextAsync", $"Failed to process exception: '{failedEx.ErrorMessage}'", LogLevel.ERROR); 
       return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, failedEx.ErrorMessage); 
      } 
      catch(InternalServerErrorException intEx) 
      { 
       _logger.AddLog("OCRController->GetTextAsync", $"Internal server error exception: '{intEx.ErrorMessage}'", LogLevel.ERROR); 
       return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, intEx.ErrorMessage); 
      } 
      catch (Exception e) 
      { 
       _logger.AddLog("OCRController->GetTextAsync", $"Exception: '{e.Message}'", LogLevel.ERROR); 
       return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "File can't be processed"); 
      } 

與此類似。但我不想「複製/粘貼」部分代碼。我怎麼把它包在一個地方?

回答

1

您需要將要被稱爲參數
喜歡的東西

private static async Task Try(Func<Task<Object>> methodToRun) 
{ 
     try 
     { 
      object ocrResult = await methodToRun(); 
     } 

     catch (Exception e) 
     { 

     } 
} 

private static Task<object> Blabla(int v) 
{ 
     throw new NotImplementedException(); 
} 

private static Task<object> Blabla() 
{ 
    throw new NotImplementedException(); 
} 

的方法你可以這樣調用

await Try(() => Blabla()); 
await Try(() => Blabla(123)); 
0

這是不可能具體,缺乏一個問題有一個很好的Minimal, Complete, and Verifiable code example,顯示你正在做什麼。但是,類似於下面的東西應該工作:

async Task<ResponseType> SafeAwaitResult(Task<ResultType> task) 
{ 
    try 
    { 
     ocrResult = await task; 

     // do something to return a "success" value for ResponseType 
    } 
    catch (FailedToProcessException failedEx) 
    { 
     _logger.AddLog("OCRController->GetTextAsync", $"Failed to process exception: '{failedEx.ErrorMessage}'", LogLevel.ERROR); 
     return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, failedEx.ErrorMessage); 
    } 
    catch(InternalServerErrorException intEx) 
    { 
     _logger.AddLog("OCRController->GetTextAsync", $"Internal server error exception: '{intEx.ErrorMessage}'", LogLevel.ERROR); 
     return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, intEx.ErrorMessage); 
    } 
    catch (Exception e) 
    { 
     _logger.AddLog("OCRController->GetTextAsync", $"Exception: '{e.Message}'", LogLevel.ERROR); 
     return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "File can't be processed"); 
    } 
} 

然後你可以使用它是這樣的:

ResponseType response = 
    await SafeAwaitResult(ocr.GetTextAsync(dataStream, filename, language)); 

如果你願意,你可以包裝在重載語法:

Task<ResponseType> SafeAwaitResponse(Stream dataStream, string fileName, CultureInfo language) 
{ 
    return SafeAwaitResult(ocr.GetTextAsync(dataStream, fileName, language)) 
} 

我不得不填寫上面的一些類型,因爲你的問題不是特定的。據推測,你可以根據這些例子推斷出正確的實際語法。如果不是,請在您的問題中提供必要的細節。