【问题标题】:How to handle exceptions in console app如何处理控制台应用程序中的异常
【发布时间】:2016-08-01 13:13:49
【问题描述】:

我有一个与硬件交互的控制台应用程序。 我的想法是使用堆栈跟踪记录所有异常,这样有价值的信息就不会因为没有文件管道而丢失。

但是如何处理那个文件的位置呢? 我不能每次都问路径。

这就是为什么我想把文件放在可执行文件旁边。 但不能确定应用程序将驻留在哪里。 而且我还没有找到“如何获取应用程序路径”的明确答案

I found:new java.io.File("").getAbsolutePath(); 但没有解释这是如何工作的。

And:getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 但是操作人员说这只有可能有效。 是否有另一种方法来处理错误记录/获取应用程序路径的可靠方法?

【问题讨论】:

  • 如何使用标准日志框架之一并遵循他们的文档。你可以试试例如slf4j 和 logback 的组合以及后者的配置将定义日志的去向、文件、elasticsearch 实例或终端。如果你然后去寻找一个文件,这可以是绝对或相对位置...
  • 应用程序或当前目录的相对路径?
  • 这将是您使用的特定日志记录框架的问题。关于 logback,以下答案将有所帮助:stackoverflow.com/questions/16480052/…
  • 请制定一个完整的答案,你会得到我的投票=)

标签: java exception-handling io


【解决方案1】:

在所有类型的应用程序中记录异常的标准方法是使用标准日志记录框架之一,并在应用程序外部定义其配置。异常将被记录为ERROR 并进行适当处理。

可以建议例如slf4j(日志接口)和 logback(匹配的实现)一起,但其他也可以。

编写代码时,接口需要在编译时可用,因为代码是针对它进行编程和编译的:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyClass {

  private static final Logger LOGGER = LoggerFactory.getLogger(Myclass.class);

  public void method() {
    try {
      ...
    } catch (IOException ex) {
      LOGGER.error("method failed to do what was expected: {}", ex);
      throw ex;
    }

需要在运行时提供特定的实现(例如,在打包时添加到 jar 中)或在运行时添加到类路径中。

接下来,需要在运行时提供与特定实现匹配的配置,对于 logback 可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>myapp.log</file>
  <encoder>
    <pattern>%logger{35} - %msg%n</pattern>
  </encoder>
</appender>

  <root level="error">
    <appender-ref ref="FILE"/>
  </root>
</configuration>

更多详情见下:

【讨论】:

  • 您似乎在努力避免提及 logging built into Java SE,它与所有其他选项一样好,并且具有不需要额外库的优势。
  • 不,我没有做这个努力。我用上面的例子来解释实际的答案(即使用“日志框架”),只是因为这个设置是我在许多项目中所经历的,并且至少在此之前一直是事实上的行业标准最近。如果在坚持日志框架的同时使用更好的解决方案,请提出修改建议。
猜你喜欢
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
相关资源
最近更新 更多