【问题标题】:AppyDynamic reports error for FileNotFoundExceptionAppyDynamic 报告 FileNotFoundException 错误
【发布时间】:2018-05-15 16:50:00
【问题描述】:

有一个简单的连接方法,

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 显示它?任何建议都会有所帮助。

【问题讨论】:

  • 您解决了这个问题吗?我面临同样的问题。 FileNotFoundException 是如此通用,以至于我不想将我的客户端配置为忽略它并希望 AppD 在处理时不要大喊大叫。
  • 我遇到了同样的问题,也想知道您是否找到了解决方案。调用可以将 404 作为“正常”流的一部分的下游 Web 服务,导致捕获 FileNotFoundException

标签: java appdynamics


【解决方案1】:

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

    }
    }
}

【讨论】:

  • 注意:如果使用 Jersey,您不能简单地执行 builder.get(String.class),因为如果您的网络服务使用 http 状态,则会在 404 上呈现异常(这是 jersey 和 HttpURLConnection 的正确行为)代码作为其逻辑的一部分,那么您应该执行 builder.get(ClientResponse.class) 以便您始终可以检查状态代码。 404 是 http 规范中的客户端错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2011-08-08
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多