如何在APP发生异常时捕获异常并输出?

我在写一个小工具APP,网上许多视频教程,资料等学起来比较容易。
最近遇到的问题是:在Android Studio上运行,甚至USB链接手机在开发者模式下运行,都是正常的。
但是一旦Build Generate Signed Bundle or APK 发布成app-release.apk,安装在手机上就会出问题。
我想捕获这些错误,以便改进等
比如:一旦发生错误就把错误信息发邮件给我,或者写到一个文件中等。
我网上查找半天,都是说: 类似:Log.d(TAG, "Time:"+ java.time.LocalTime.now());

我手机上倒是有第三方的,否则我还写不下去了呢!

img

一般通过 Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler);来实现全局异常捕获,不过只能捕获java异常;上报还得你自己实现。
可以使用第三方框架,比如腾讯的bugly

【以下回答由 GPT 生成】

对于在APP发生异常时捕获异常并输出的需求,可以通过以下步骤来实现:

  1. 异常处理:在你的代码中使用try-catch块来捕获异常。将你认为可能会发生异常的代码放在try块中,并在catch块中处理异常。
try {
    // 可能会发生异常的代码
} catch (Exception e) {
    // 异常处理逻辑
}
  1. 记录异常信息:在catch块中可以使用Log类的方法将异常信息记录下来。你可以使用Log类的不同方法来记录不同级别的日志信息,比如使用Log.e方法来记录错误日志信息。
try {
    // 可能会发生异常的代码
} catch (Exception e) {
    Log.e(TAG, "Error: ", e);
}
  1. 发送错误信息:如果你希望将错误信息发送到你的邮箱,可以使用Java Mail API来发送邮件。首先,你需要添加Java Mail API的依赖。
implementation 'com.sun.mail:android-mail:1.6.2'
implementation 'com.sun.mail:android-activation:1.6.2'

然后,你可以在catch块中创建一个邮件,包含异常信息,并发送给你的邮箱。

try {
    // 可能会发生异常的代码
} catch (Exception e) {
    Log.e(TAG, "Error: ", e);

    // 创建一个邮件
    Properties properties = new Properties();
    properties.put("mail.smtp.host", "smtp.example.com"); // 设置你的SMTP服务器地址
    Session session = Session.getInstance(properties, null);

    try {
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("from@example.com")); // 设置发件人邮箱
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("to@example.com")); // 设置收件人邮箱
        message.setSubject("App Error");
        message.setText(e.toString());

        // 发送邮件
        Transport.send(message);
    } catch (MessagingException ex) {
        Log.e(TAG, "Error sending email: ", ex);
    }
}
  1. 写入文件:如果你希望将错误信息写入到一个文件中,可以使用Java的File类和FileWriter类来实现。首先,你需要申请写入文件的权限。在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

然后,在catch块中创建一个File对象,指定文件路径和文件名,然后使用FileWriter类将异常信息写入文件。

try {
    // 可能会发生异常的代码
} catch (Exception e) {
    Log.e(TAG, "Error: ", e);

    // 写入文件
    File file = new File(Environment.getExternalStorageDirectory(), "error.txt");
    try {
        FileWriter writer = new FileWriter(file);
        writer.write(e.toString());
        writer.flush();
        writer.close();
    } catch (IOException ex) {
        Log.e(TAG, "Error writing file: ", ex);
    }
}

这样,当你的APP发生异常时,异常信息就可以通过日志、邮件或文件的形式进行记录或发送了。请注意,在实际使用中,你可能还需要处理一些发送邮件或写文件相关的权限请求。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

该回答引用gpt
在Android中捕获异常并输出可以使用以下代码:

try {
    // Your code that may throw an exception
} catch(Exception e) {
    Log.e(TAG, "Exception: " + e.getMessage());
    e.printStackTrace();
}

其中,TAG是一个字符串常量,用于标记日志输出,e.getMessage()用于获取异常信息,e.printStackTrace()用于输出详细的异常堆栈信息。

如果你想将错误信息发送到你的邮箱或者写入一个文件中,可以将Log.e()函数换成你自己的实现,例如:

1.发送邮件
可以使用JavaMail库发送邮件,示例代码如下:

private void sendEmail(String error) {
    final String username = "your_email@gmail.com";
    final String password = "your_email_password";

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.port", "587");

    Session session = Session.getInstance(props,
      new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
      });

    try {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("your_email@gmail.com"));
        message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse("recipient_email@gmail.com"));
        message.setSubject("Exception occurred in MyApp");
        message.setText(error);

        Transport.send(message);

    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }
}

在catch语句块中调用sendEmail()函数即可将错误信息发送到你的邮箱。

2.写入文件
可以使用File类和FileOutputStream类将错误信息写入文件中,示例代码如下:

private void writeToFile(String error) {
    try {
        File file = new File(Environment.getExternalStorageDirectory(), "MyAppErrors.txt");
        FileOutputStream fos = new FileOutputStream(file, true);
        PrintWriter pw = new PrintWriter(fos);
        pw.println(error);
        pw.flush();
        pw.close();
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

在catch语句块中调用writeToFile()函数即可将错误信息写入文件中。

你可以根据自己的需求选择适合的方法来处理异常信息。

可以引入腾讯的bugly实现异常上报功能

可以把release的打包设置里的debuggable设为true,这样直接在studio上可以看到日志。
另外,debug没问题release不行,首先怀疑是混淆的问题,可以先把minifyEnabled设为false,打一个不混淆的release包试试看,如果没问题那就仔细筛查混淆配置。