gpt4 book ai didi

java - 在java中重新抛出不同的捕获异常

转载 作者:行者123 更新时间:2023-11-30 04:25:02 24 4
gpt4 key购买 nike

我有以下下载功能。我在途中捕获了一些可能的异常,并将它们存储在 Exception 类型变量中,在finally block 中清理之后,我想重新抛出原始异常(如果捕获了异常)或抛出我自己的自定义 DownloadFailedException 。问题是 Eclipse 给我“未处理的异常类型异常”错误,因为我的函数没有声明抛出异常。有没有一种“好”的方法来做到这一点?

public static boolean downloadFile(String urlString, String dstPath) throws DownloadFailedException, IOException {
if (!Settings.isNetworkAvailable()) {
throw new NoNetworkException("Network error: no internet connection. Failed downloading " + urlString);
}
InputStream input = null;
BufferedOutputStream output = null;
int fileLength = -1;
long total = 0;
int statusCode = -1;
HttpGet get = new HttpGet(urlString);
get.setHeader("User-Agent", Settings.getUserAgent());
get.setHeader("X-My-Id", Settings.getDeviceId());
HttpClient client = new DefaultHttpClient();
HttpResponse response = null;
try {
response = client.execute(get);
statusCode = response.getStatusLine().getStatusCode();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (200 != statusCode) {
throw new DownloadFailedException("http error: " + statusCode +". Failed downloading " + urlString, statusCode);
}
}
if (null != response) {
HttpEntity entity = response.getEntity();
File tmpFile = null;
Exception exception = null;
try {
InputStream is = entity.getContent();
byte b[] = new byte[1];
is.read(b, 0, 0);
fileLength = (int)entity.getContentLength();
input = new BufferedInputStream(is, 8192);
tmpFile = new File(dstPath + ".tmp");
tmpFile.createNewFile();
output = new BufferedOutputStream(new FileOutputStream(tmpFile), 8192);

byte data[] = new byte[8192];
int count;
while ((count = input.read(data)) != -1) {
total += count;
output.write(data, 0, count);
}
} catch (IllegalStateException e) {
exception = e;
e.printStackTrace();
} catch (IOException e) {
exception = e;
e.printStackTrace();
} finally {
try {
if (null != output) {
output.flush();
output.close();
}
if (null != input)
input.close();
} catch (IOException e) {
if (null == exception)
exception = e;
}
if (-1 < fileLength && total != fileLength) {
if (null != tmpFile) {
tmpFile.delete();
}
if (null != exception) {
// HERE I WOULD LIKE TO RE-THROW THE ORIGINAl EXCEPTION
throw exception; // Unhandled exception type Exception
//also tried: exception.getClass().cast(exception);
} else
throw new DownloadFailedException(urlString + ": only " + total + " bytes read out of " + fileLength);
}
File dstFile = new File(dstPath);
tmpFile.renameTo(dstFile);
}
return true;
}
return false;
}

解决方案:

if (null != exception) {
if (exception instanceof IllegalStateException)
throw (IllegalStateException) exception;
else if (exception instanceof IOException)
throw (IOException) exception;
else
throw new RuntimeException(message, exception);
}
//throw new IOException("Only " + total + "bytes read from " + fileLength);
throw new DownloadFailedException(message);

最佳答案

你所在的地方:

// HERE I WOULD LIKE TO RE-THROW THE ORIGINAl EXCEPTION
throw exception; // Unhandled exception type Exception
// also tried: exception.getClass().cast(exception);

我会用这个:

if(exception instanceof IOException)
throw (IOException) exception;
else
throw new DownloadException(exception);

根据您描述的情况和方法末尾的 throws 子句,该代码会执行您想要执行的操作。在英语中,该代码的作用如下:

  • 如果您捕获 Exception 并且它是 IOException,那么您需要抛出 IOException
  • 如果您捕获Exception,但它不是IOException,则您需要抛出DownloadException(您自己创建的)。我们将所有非 IOException 包装在 DownloadException 中,以便您的实现与方法中的 throws 子句保持一致。
  • 如果您没有捕获异常,那么您希望生活继续正常

请注意,您可能需要向类 DownloadException 添加一个类似 public DownloadException(Throwable e){super(e);} 的构造函数(如果构造函数具有该构造函数)签名尚不存在),然后才能编译。

关于java - 在java中重新抛出不同的捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16135227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com