java - AppyDynamic 报告 FileNotFoundException 错误
问题描述
有一个简单的连接方法,
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class Connection {
public boolean connect(URL url, String requestType) {
HttpURLConnection connection = null;
try {
URLConnection urlConnection = url.openConnection();
if (urlConnection instanceof HttpURLConnection) {
connection = (HttpURLConnection) urlConnection;
connection.setRequestMethod(requestType);
connection.setRequestProperty("Authorization", getAuth()); //$NON-NLS-1$
}
if (connection == null) {
return false;
}
connection.connect();
return connection.getResponseCode() == HttpURLConnection.HTTP_OK;
} catch (IOException e) {
return false;
}
}
}
如果 URL 路径不是有效路径,FileNotFoundException 将在 AppyDynamics 中记录为错误。如何防止 AppDynamics 捕获这些异常,因为作为代码的一部分,它作为布尔返回处理,但 AppDynamics 被 FileNotFoundException 淹没。提前致谢。
更新 根据 AppDynamics 文档https://docs.appdynamics.com/display/PRO44/Errors+and+Exceptions HTTP 错误响应,例如状态代码 404 或 500 响应被记录为事务快照错误。正如我所知道的,在我上面的代码中,响应 404 是合法的。如何修改我的代码以防止 AppDynamics 显示它?任何建议都会有所帮助。
解决方案
您确定稍后尝试在连接上执行 getInputStream 时没有收到 FileNotFound (或者在您的真实代码中,以防这是一个简化的示例)?由于 HttpUrlConnection 实现了 http 协议,并且 4xx 代码是尝试调用 getInputStream 生成 FNF 的错误代码。相反,您应该调用 getErrorStream。
我运行了您的代码(没有 auth 部分),并且没有对返回 404 的 url 进行任何 FilenotFoundException 测试。
因此,在这种情况下,HttpUrlConnection 正确实现了 http 协议,并且 appdynamics 正确捕获了错误。我在将 FnF 包装在 UniformResourceException 的球衣中遇到了同样的问题,但经过一些分析,它实际上是球衣应该提供在返回输出之前检查状态代码的方法,或者正确使用 httpurlconnection,在我们的例子中 - 网络服务不应该返回404 用于产生未找到结果但产生空集合的请求。
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class Connection {
public boolean connect(URL url, String requestType) {
HttpURLConnection connection = null;
try {
URLConnection urlConnection = url.openConnection();
if (urlConnection instanceof HttpURLConnection) {
connection = (HttpURLConnection) urlConnection;
connection.setRequestMethod(requestType);
}
if (connection == null) {
return false;
}
connection.connect();
System.out.println(connection.getResponseCode());
return connection.getResponseCode() == HttpURLConnection.HTTP_OK;
} catch (IOException e) {
System.out.println("E" + e.getMessage());
return false;
}
}
public static void main(String args[])
{
Connection con = new Connection();
try{
con.connect(new URL("http://www.google.com/asdfasdfsd"), "GET");
} catch(MalformedURLException mfe)
{
}
}
}
推荐阅读
- google-sheets - #参考!使用 ArrayFormula 移动行时出错
- maven - maven-archetype-plugin 中的 ClassNotFoundException
- nsis - 如何将文件(.exe .txt 等)嵌入到 NSIS 安装程序中以创建一个大的 .EXE 安装程序包?
- ios - 安装 Xcode 11 后无法在模拟器上运行应用程序 - CFBundleVersion 错误
- sql - 从行中选择值较小的行
- sql - 从分组查询中删除连接操作
- python-3.x - 在mac中使用python3将doc.x转换为pdf文件
- javascript - Cloud Function - BigQuery 仅返回一个具有域的对象 ( null )
- flow-project - 如何使用 Flow 处理异构流量?
- angular - Angular 尝试获取特定值不起作用