为了账号安全,请及时绑定邮箱和手机立即绑定

如何在单个 catch 块中处理所有 java.net 异常?

如何在单个 catch 块中处理所有 java.net 异常?

HUH函数 2023-03-23 15:28:52
我正在尝试处理作为 java.net 包一部分的异常。我浏览了文档,看到了属于该包的 12 个异常,但我找不到这些异常的父类。到目前为止,我尝试过的是:catch(Exception e){    if(e instanceof org.openqa.selenium.WebDriverException)        sendException("Problem is with the selenium web driver");    else if(e instanceof java.net.Exception) //I need help with this line        sendException("There is some problem with the network");}尝试此操作后,我收到以下错误消息无法解析类 java.net.Exception如何捕获 java.net 异常?
查看完整描述

4 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

java.net.Exception不存在,您不能以这种方式从特定包中捕获类的异常。

考虑到网络异常总是从开始java.net也是错误的。

一些网络异常不是由异常开始的java.net,异常也可以被另一个异常包裹。例如java.net.SocketException可以由java.lang.IllegalStateException.

你不会处理它,因为那不是java.net例外。


使用 looks处理异常instanceOf也无济于事。

在子句中指定一个特定的例外catch就足够了。

另请注意,异常是不言自明的,并且应该在其状态中包含所有相关信息:您不需要像您那样将异常映射到文本消息。


您要发送/记录的内容是利用与之关联的异常类/消息/原因/stracktrace。您所做的只是解释容易出错的异常含义。


这样做:


catch(Exception e){

    sendException(e); 

}


public void sendException(Exception e){

   // exploit e.getClass(), e.getMessage() or e.getStackTrace()

   ...

}

请注意,在某些情况下,您希望捕获一些特定的异常,因为您对它们有特定的处理:


catch(WebDriverException e){

     processWebDriverException(e);

}

catch(Exception e){

     processAnyOtherException(e);

}


查看完整回答
反对 回复 2023-03-23
?
www说

TA贡献1775条经验 获得超8个赞

首先,你抓不到的原因java.net.Exception。该Exception课程在 中java.lang,这不是您应该捕捉的异常。


那你应该抓什么呢?


不幸的是,没有适合所有网络异常的超类型,也没有非网络异常。但事实证明,大多数网络异常都有java.io.IOException一个祖先。


(有一个java.net.*异常不是源自IOException; 即java.net.URISyntaxException。但这是一个未经检查的异常,并不表示存在“网络问题”。)


所以一种方法是捕捉IOException. 您可以通过使用反射来获取异常类的包名称来进一步完善它(请参阅https://stackoverflow.com/a/57002571/139985);例如


} catch (org.openqa.selenium.WebDriverException e) {

    sendException("Problem is with the selenium web driver");

} catch (IOException e) {

    if (e.getClass().getPackage().startsWith("java.net"))

        sendException("There is some problem with the network");

    else {

        throw e;  // Or diagnose differently

    }

}


查看完整回答
反对 回复 2023-03-23
?
SMILET

TA贡献1796条经验 获得超4个赞

java.net.Exception 不存在,java.lang.Exception 存在。


要检查包是否为 java.net,请使用 e.getClass().getPackage():


catch(Exception e)

{

    if(e instanceof org.openqa.selenium.WebDriverException)

        sendException("Problem is with the selenium web driver");

    else if(e.getClass().getPackage().startsWith("java.net"))

        sendException("There is some problem with the network");

}


查看完整回答
反对 回复 2023-03-23
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

您可以像这样捕获 java.net 异常:


try {


}

catch (

    BindException 

    | ConnectException 

    | HttpRetryException

    | MalformedURLException

    | NoRouteToHostException

    | PortUnreachableException

    | ProtocolException

    | SocketException

    | SocketTimeoutException

    | UnknownHostException

    | UnknownServiceException

    | URISyntaxException

    e

){

    // do stuff with e

}

但是,如果您要调用instanceofafter 以不同方式处理每个异常,那有什么意义呢?


在这种情况下,您应该使用不同的 catch 块。


查看完整回答
反对 回复 2023-03-23
  • 4 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信