首页 > 解决方案 > 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 显示它?任何建议都会有所帮助。

标签: javaappdynamics

解决方案


您确定稍后尝试在连接上执行 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)
    {

    }
    }
}

推荐阅读