GWT向客户端抛出异常

GWT向客户端抛出异常,gwt,exception-handling,throw,Gwt,Exception Handling,Throw,有人可以在GWT中向客户机抛出异常吗 在我的serviceasync接口中,我也在我的服务接口中这样做 void ActivateUserAccount(String ActivationCode,AsyncCallback <Boolean> Callback) throws AlreadyActivatedError; 我的例外情况如下: public class AlreadyActivatedError extends Exception implements IsSeri

有人可以在GWT中向客户机抛出异常吗

在我的serviceasync接口中,我也在我的服务接口中这样做

void ActivateUserAccount(String ActivationCode,AsyncCallback <Boolean> Callback) throws AlreadyActivatedError;
我的例外情况如下:

public class AlreadyActivatedError extends Exception implements IsSerializable
{
    public AlreadyActivatedError()
    {
        super();
    }
}

GWT只能处理(这意味着从服务器发送到客户端)从扩展而来的未序列化的数据。我不知道什么是
alreadyaactivatederror
。如果不是RuntimeException,则无法将其发送到客户端(浏览器)

不确定为什么hilal的回答被接受,因为它是完全错误的

为了使异常到达客户端浏览器,您必须抛出一个可序列化的、在服务接口中定义的异常

如果您的服务实现抛出一个
运行时异常
,web客户端将收到一个通用的500错误消息,如下所示:

   [WARN] Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract my.module.shared.Result my.module.client.service.Service.doSomething() throws my.module.shared.exception.MyCheckedException' threw an unexpected exception: my.module.shared.exception.AuthzRuntimeException: some authz message
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:389)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:579)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Caused by: my.module.shared.exception.AuthzRuntimeException: some authz message
    at my.module.shared.Authz.doSomeCheck(Authz.java:101)
    at my.module.server.ServiceImpl.doSomething(ServiceImpl.java:283)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
    ... 22 more
[ERROR] 500 - POST /module/userService (127.0.0.1) 57 bytes
   Request headers
      Host: 127.0.0.1:8888
      User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
      Accept-Language: en-US,en;q=0.5
      Accept-Encoding: gzip, deflate
      Referer: http://127.0.0.1:8888/foo.html?gwt.codesvr=127.0.0.1:9997
      Cookie: worknet=7k8g41ulbl674dp865t180tji5
      Connection: keep-alive
      Cache-Control: no-cache
      X-GWT-Permutation: HostedMode
      X-GWT-Module-Base: http://127.0.0.1:8888/module/
      Content-Type: text/x-gwt-rpc; charset=utf-8
      Content-Length: 1076
      Pragma: no-cache
   Response headers
      Content-Type: text/plain
(RequestCallbackAdapter.java:209) 2013-10-18 13:16:56,966 [WARN ] Fail ""
com.google.gwt.user.client.rpc.StatusCodeException: 500 The call failed on the server; see server log for details
    at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:209)
    at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:258)
    at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:412)
    at sun.reflect.GeneratedMethodAccessor40.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:242)
    at sun.reflect.GeneratedMethodAccessor37.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
    at java.lang.Thread.run(Unknown Source)

可能还需要注意的是,如果您的特定异常没有标准构造函数,也会显示generic 500错误消息,因为无法对异常进行反序列化。遗憾的是,gwt编译器和开发模式插件并不总是明确指出这个问题。。(无论如何,我就是这样来到这里的)


因此,结合vinnyjames所说的(异常必须可序列化并在(RPC)服务的接口中定义),我发现在gwt客户机代码中处理异常并不太复杂。

只是为了澄清一切:您可以同时抛出checked(扩展
exception
的异常)和unchecked(扩展
RuntimeException
)从服务器到客户端的异常-只要异常存在。但是建议抛出已检查的异常,因为它们

表示程序无法直接控制的区域内的无效条件(无效用户输入、数据库问题、网络中断、缺少文件)

相反,未经检查的异常

表示程序中的缺陷(Bug)-通常传递给非私有方法的参数无效

作为例外情况,必须满足以下条件才能将异常发送到客户端:

  • 它必须扩展
    Exception
    (注意
    RuntimeException
    就是这样做的)
  • 它必须是。简而言之:实现
    可序列化
    ,具有无参数构造函数,并且所有字段都可序列化
  • *服务
    界面中,您需要向可以引发异常的方法添加
    抛出
    声明。请注意,您不需要向
    *异步
    界面添加
    抛出
    声明
设置好后,您将能够在
异步回调中的
onFailure
方法中处理异常

一些代码根据以下示例将所有部分显示在一起:

DelistedException.java
公共类DelistedException扩展异常实现可序列化{
私有字符串符号;
//注意无参数构造函数
//它可以被保护,这样只有子类才能使用它
//(因为如果他们也想序列化,他们需要
//调用超类“无参数构造函数…”的无参数构造函数
受保护的DelistedException(){
}
公共DelistedException(字符串符号){
这个符号=符号;
}
公共字符串getSymbol(){
返回此.symbol;
}
}
StockPriceService.java
@RemoteServiceRelativePath(“股票价格”)
公共接口StockPriceService扩展了RemoteService{
StockPrice[]getPrices(字符串[]符号)抛出DelisteException;
}
StockPriceServiceAsync.java
公共接口StockPriceServiceAsync{
void getPrices(字符串[]符号,异步回调);
}
在客户端
AsyncCallback callback=new AsyncCallback(){
失败时的公共无效(可丢弃){
if(捕获DelistedException的实例){
//用它做点什么
}否则{
//可能是一些未经检查的例外,
//显示一些一般错误消息
}
成功时公开作废(股票价格[]结果){
//成功!
}
};
获取价格(符号,回调);

您能澄清一下您的问题吗?。您当前的方法有什么问题吗?您在服务器端抛出的异常没有到达gwt客户端。这是您的问题吗?.Hilal,与您所说的相反。只有在服务器端生成的已检查异常才会发送到gwt层。对于未经检查的异常,您只会得到com.google.gwt.user.client.rpc.StatusCodeException。你应该更正你的答案。@Gursel从eclipse中的新web项目开始。你可以看到IllegalArgumentException,它从RuntimeException扩展而来,RuntimeException是未选中的exception。好吧,这与我说的有什么关系。。我没有说IllegalArgumentException是checkedException。我说的是只有检查过的异常才会从服务器传播到gwt层。您可以很容易地检查这一点。因此,我们说的是相同的事情,但格式不同。写“CanHandle”我的意思是,异常应该是可以在客户端处理和捕获的运行时异常,我也对这个答案被接受感到困惑,因为它是完全错误的。我在我的答案中提供了一些细节,关于如果您试图从服务实现中抛出未经检查的运行时异常,Jetty日志中会显示什么。
   [WARN] Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract my.module.shared.Result my.module.client.service.Service.doSomething() throws my.module.shared.exception.MyCheckedException' threw an unexpected exception: my.module.shared.exception.AuthzRuntimeException: some authz message
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:389)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:579)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Caused by: my.module.shared.exception.AuthzRuntimeException: some authz message
    at my.module.shared.Authz.doSomeCheck(Authz.java:101)
    at my.module.server.ServiceImpl.doSomething(ServiceImpl.java:283)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
    ... 22 more
[ERROR] 500 - POST /module/userService (127.0.0.1) 57 bytes
   Request headers
      Host: 127.0.0.1:8888
      User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
      Accept-Language: en-US,en;q=0.5
      Accept-Encoding: gzip, deflate
      Referer: http://127.0.0.1:8888/foo.html?gwt.codesvr=127.0.0.1:9997
      Cookie: worknet=7k8g41ulbl674dp865t180tji5
      Connection: keep-alive
      Cache-Control: no-cache
      X-GWT-Permutation: HostedMode
      X-GWT-Module-Base: http://127.0.0.1:8888/module/
      Content-Type: text/x-gwt-rpc; charset=utf-8
      Content-Length: 1076
      Pragma: no-cache
   Response headers
      Content-Type: text/plain
(RequestCallbackAdapter.java:209) 2013-10-18 13:16:56,966 [WARN ] Fail ""
com.google.gwt.user.client.rpc.StatusCodeException: 500 The call failed on the server; see server log for details
    at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:209)
    at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:258)
    at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:412)
    at sun.reflect.GeneratedMethodAccessor40.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:242)
    at sun.reflect.GeneratedMethodAccessor37.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
    at java.lang.Thread.run(Unknown Source)