如何在控制台应用程序中处理异常

时间:2016-08-01 13:13:50

标签: java exception-handling io

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

但是如何处理该文件的位置? 我不能每次都要求一条路。

这就是我想把文件放在可执行文件旁边的原因。 但无法确定应用程序将驻留在哪里。 我还没有找到一个明确的答案,如何获得应用程序路径"

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

And: getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 但是op表示只有可能有效。 有没有其他方法来处理错误记录/获得应用程序路径的确定方法?

1 个答案:

答案 0 :(得分: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>

进一步详情见下: