如何从 Web 服务中捕获一个抛出的 soap 异常?

12

我已经成功地在我的 web service 中抛出了一些 SOAP 异常。我想捕获这些异常并访问调用异常时调用的字符串和 ClientFaultCode。以下是我在 web service 中的一个异常示例:

throw new SoapException("You lose the game.", SoapException.ClientFaultCode);

我在客户端尝试调用来自 Web 服务的方法,该方法可能会抛出异常,并将其捕获。问题是我的 catch 块没有做任何事情。请看这个示例:

try
{
     service.StartGame();
}
catch
{
     // missing code goes here
}

我怎样才能访问抛出异常时调用的字符串和 ClientFaultCode?


我一直在努力解决这个问题,创建一个带有错误消息的简单响应类是最好的选择。请参考此问题和答案:https://dev59.com/0HVD5IYBdhLWcg3wRpeX - Justin
3个回答

10

你可能希望捕获特定的异常。

try
{
     service.StartGame();
}
catch(SoapHeaderException)
{
// soap fault in the header e.g. auth failed
}
catch(SoapException x)
{
// general soap fault  and details in x.Message
}
catch(WebException)
{
// e.g. internet is down
}
catch(Exception)
{
// handles everything else
}

这只是回答Louise问题的内容。 - Roman Boiko

8

捕获 SoapException 实例。这样您就可以访问其信息:

try {
     service.StartGame();
} catch (SoapException e)  {
    // The variable 'e' can access the exception's information.
}

3
为确保Lou在进行这个更改时不会破坏他的代码,他可以添加一个额外的catch (Exception e)块。有时可能会出现异常不是SoapException,例如:OutOfMemoryException、连接问题、线程中止等。 - Roman Boiko
这个很好用。但是,我有一个问题。我怎么才能找出这个字符串的真正名称,以便我可以访问它?例如:e.GetString() 或其他什么。对于这个特定的例子,我想访问字符串“你输了游戏”。 - Lou
我可以调用e.Message,它会返回一个非常长的错误消息,但我只想要字符串消息。 - Lou
Louise,我不知道你的情况,但我猜你可以创建继承自SoapException的类,并添加任何你需要的额外信息。然后按照这里所描述的,在捕获之前为这些类添加catch块。 - Roman Boiko
Louise: e.Message 返回的字符串与构造函数传入的完全相同,我进行了测试。也许你使用了其他异常类,该类会向消息中添加额外的信息? - Roman Boiko
显示剩余2条评论

1
catch (SoapException soapEx) 
{
  //Do something with soapEx
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接