TLDR:有没有更好的方法来通知客户端服务器上发生意外情况而不会在IDL中定义异常。
只是为了澄清:我目前在服务器端使用Thrift和C#(THttpServer,TThreadPooledServer)和客户端上的JavaScript AngularJS App(我在C#上运行客户端foo的一些测试)。
所以......我知道Apache Thrift中存在异常处理。我可以在IDL中定义一个并告诉服务方法可能发生该异常。当发生这种情况时,客户端会收到通知,说明发生了此异常并可以采取相应措
但是,如果由于某种原因导致处理程序中执行的代码继续执行而死亡并抛出异常,则客户端只会得到一个"无法读取,远程端已关闭"错误,那就是那个。我无法真正看到那里发生的事情,我必须开始调试服务器而不知道该看什么。当然,我可以在服务器端(我打算这样做)记录该异常,但这可能会变得混乱并需要一段时间来查看。
我真正想要的是让客户至少知道服务器端发生的事情而不仅仅是让它得到一个"是的。连接刚刚关闭。不知道为什么会这样。祝你节日快乐!"。
获得此功能的一种方法是制作GeneralExceptions.thrift文件并在其中定义常规异常。然后在每个其他.thrift文件中包含此文件,并让每个服务方法都将该异常视为可能发生的异常。然后围绕我的thrift处理程序方法进行巨大的尝试catch块来捕获所有内容和他们的母亲并将其包装在一个整洁的通用thrift异常包中并将其转发给客户端。
问题是......必须让那些尝试捕获块到处都会很烦人。并且必须在所有其他文件中包含一个thrift文件,并且让每个服务方法都声明它可以抛出这个一般的例外......好吧,我只想说......它有大量的工作,而且人们是人们的方式通常是他们可能只是忘记包含文件或不在这些服务方法中添加异常以及如果你有多个人或gal工作在任何给定的事情上往往会发生的所有其他好事。
所以有人知道另一种方式通知客户"东西"发生在服务器上没有跳过大量的篮球?
答案 0 :(得分:0)
服务器既不应该死也不应该关闭连接。我最近在Trunk中修复了exactly that problem for 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
}
}
问题是......必须让那些尝试捕获块到处都会很烦人。并且必须在所有其他文件中包含一个thrift文件,并且让每个服务方法都声明它可以抛出这个一般的例外......好吧,我只想说......它有大量的工作,而且人们是人们的方式通常是他们可能只是忘记包含文件或不在这些服务方法中添加异常以及如果你有多个人或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
}
}
这非常简单,可以轻松实现自动化。