簡體   English   中英

Apache Thrift中的常規錯誤處理

[英]General error handling in Apache Thrift

TLDR:是否有更好的方法可以通知客戶端服務器上發生了意外情況,而不會引發IDL中定義的異常。

只是為了澄清:我目前在服務器端(THttpServer,TThreadPooledServer)和C#一起使用Thrift,在客戶端使用JavaScript AngularJS應用程序(並且我在C#上有一些運行Client foo的測試)。

所以...我知道Apache Thrift中有異常處理。 我可以在IDL中定義一個,然后告訴服務方法該異常有可能發生。 並且當發生這種情況時,客戶端會收到通知,告知該異常已發生並且可以采取相應措施。

但是,如果由於某種原因在處理程序中執行的代碼只是繼續執行並死掉並引發異常,則客戶端僅會收到“無法讀取,遠程端已關閉”錯誤,僅此而已。 我真的看不到那里發生了什么,因此我不得不開始調試服務器而沒有任何線索。 當然,我可以在服務器端記錄該異常(我打算這樣做),但這可能會變得很混亂,並且需要花費一些時間進行研究。

我真正想要的是讓客戶端至少知道服務器端發生了什么,而不僅僅是得到“是的。連接剛剛關閉。不知道為什么會發生。晚上好!”。

一種實現方法是制作一個GeneralExceptions.thrift文件並在其中定義一個通用異常。 然后將此文件包含在其他所有.thrift文件中,並使每種服務方法都將這種異常視為可能發生的異常。 然后在我的節儉處理程序方法周圍進行巨大的嘗試捕獲塊,以捕獲所有內容及其母親,並將其包裝在一個簡潔的通用節儉異常包中,並交給客戶。

問題是...必須到處都有那些嘗試捕獲塊會很煩人。 而且必須在所有其他文件中包含一個節儉文件,並讓每個服務方法聲明它都可以拋出此一般異常...好吧,可以這么說...這是一項繁重的工作,並且人們與人們通常一樣可能只是忘記了包含文件,或者沒有在這些服務方法中添加異常,並且如果您讓一個人或gal處理任何給定的事情,往往會發生所有其他美好的事情。

那么,有沒有人知道另一種方法來通知客戶端服務器上發生了“東西”,而又不會跳過很多圈呢?

服務器既不應該死亡也不應該關閉連接。 我最近 Trunk中的Delphi修復了該問題 (將是0.9.3的一部分)。 如果C#遇到相同的問題,請提交票證(包括測試用例)和/或提供補丁。

在服務器方法中捕獲任何意外的異常該怎么辦? 這種模式對於普通的COM也是有用的,沒有太大的區別:

// this is a service method
void FooBar() {  
  try
  {
    // lets see whether we can divide by zero ...
    var a = 0;
    var b = 1/a;
    Console.Writeln("It works!!");
  }
  catch(e:TException)
  {
    throw; // Thrift exception, don't interfere
  }
  catch(e:Exception)
  {
     throw new TApplicationException( "WTF?");  // or some other exception
  }
}

問題是...必須到處都有那些嘗試捕獲塊會很煩人。 而且必須在所有其他文件中包含一個節儉文件,並讓每個服務方法聲明它都可以拋出此一般異常...好吧,可以這么說...這是一項繁重的工作,並且人們與人們通常一樣可能只是忘記了包含文件,或者沒有在這些服務方法中添加異常,並且如果您讓一個人或gal處理任何給定的事情,往往會發生所有其他美好的事情。

通過其他方法生成直接服務器實現,並將實際工作轉發到其他方法和/或類:

// this is a service method
MyResult FooBar( MyArg arg1, MyOtherArg arg2) {  
  try
  {
    return pimpl.FooBar(arg1,arg2);  // delegate work via pimpl pattern
  }
  catch(e:TException)
  {
    throw; // Thrift exception, don't interfere
  }
  catch(e:Exception)
  {
     throw new TApplicationException( "WTF?");  // or some other exception
  }
}

這非常簡單,可以輕松實現自動化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM