你们项目中怎么处理程序崩溃?
当然是try住了
那异常日志怎么收集呢?
一般会手写一个工具类,然后在可能出问题的地方通过特殊的方法进行记录日志,然后找时机上传
这位同学,你是不是没有睡醒,我问的是异常日志,是你未知状态的异常,难道你要把整个项目try住?
这样啊,那可以写一个CrashHandler : Thread.UncaughtExceptionHandler,在Application中注册。
然后在重写的uncaughtException(t: Thread, e: Throwable)中收集日志信息。
为什么出现异常了,程序会停止运行呢?
应该是系统结束了整个程序进程吧
那出现异常了,程序一定会停止运行么?
嗯...应该会.....吧
在未知异常的情况下,有办法让程序不崩溃么?
嗯...应该可以吧...
好了,回去等通知吧.
以上是一段加过戏的面试场景,考察的是对异常处理,以及Handler对应原理的了解程度。 接下来我们一个一个分析问题。
try catch会影响程序运行性能么?
首先,try catch使用,要尽可能的缩小作用域,当try catch作用域内未抛出异常时,性能影响并不大,但是只要抛出了异常就对性能影响是成倍的。 具体我进行了简单的测试,分别针对了以下三种情况。
- 没有try catch
- 有try catch但是没有异常
- 既有try catch又有异常。
fun test() {
val start = System.currentTimeMillis()
var a = 0
for (i in 0..1000) {
a++
}
Log.d("timeStatistics", "noTry:" + (System.currentTimeMillis() - start))
}
fun test2() {
val start = System.currentTimeMillis()
var a = 0
for (i in 0..1000) {
try {
a++
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
}
Log.d("timeStatistics", "tryNoCrash:" + (System.currentTimeMillis() - start))
}
fun test3() {
val start = System.currentTimeMillis()
var a = 0
for (i in 0..1000) {
try {
a++
throw java.lang.Exception()
} catch (e: java.lang.Exception) {
e.printStackTrac