Android - in backtrace ngoại lệ đầy đủ để ghi nhật ký


94

Tôi có một khối try / catch ném một ngoại lệ và tôi muốn xem thông tin về ngoại lệ trong nhật ký thiết bị Android.

Tôi đọc nhật ký của thiết bị di động bằng lệnh này từ máy tính phát triển của mình:

/home/dan/android-sdk-linux_x86/tools/adb shell logcat

Tôi đã thử điều này đầu tiên:

try {
    // code buggy code
} catch (Exception e)
{
    e.printStackTrace();
}

nhưng điều đó không in bất cứ thứ gì vào nhật ký. Đó là một điều đáng tiếc vì nó sẽ giúp ích rất nhiều.

Điều tốt nhất tôi đã đạt được là:

try {
    // code buggy code
} catch (Exception e)
{
    Log.e("MYAPP", "exception: " + e.getMessage());             
    Log.e("MYAPP", "exception: " + e.toString());
}

Còn hơn không nhưng không hài lòng lắm.

Bạn có biết làm thế nào để in đầy đủ backtrace vào nhật ký?

Cảm ơn.

Câu trả lời:


165
try {
    // code that might throw an exception
} catch (Exception e) {
    Log.e("MYAPP", "exception", e);
}

Rõ ràng hơn với thông tin bổ sung

(Vì đây là câu hỏi lâu đời nhất về điều này.)

Các phương thức nhật ký Android ba đối số sẽ in dấu vết ngăn xếp cho một Exceptiontham số được cung cấp dưới dạng tham số thứ ba. Ví dụ

Log.d(String tag, String msg, Throwable tr)

nơi trlà ngoại lệ.

Theo nhận xét này, những phương pháp Log "sử dụng getStackTraceString()phương pháp ... hậu trường" để làm điều đó.


4
Ngoài ra, My style: Log.e (e.getClass (). GetName (), e.getMessage (), e);
Vikas

27
Hãy cẩn thận khi sử dụng e.getMessage () - getMessage () có thể trả về null, tùy thuộc vào loại ngoại lệ đã được ném ra, tự nó sẽ gây ra ngoại lệ vì null không được hỗ trợ như một tham số thông báo trong các phương thức Nhật ký. Xem tại đây
Uniqe

Bên cạnh đó, sẽ có ý nghĩa hơn khi mô tả loại mã nào gây ra ngoại lệ này trong tham số thứ hai. Dù sao thì thông báo cũng đã được đưa vào đầu ra.
EboMike

1
Những gì @Unique nói là rất quan trọng. Tốt hơn là sử dụng Nhật ký như đã đề cập trong câu trả lời vì nó đã in dấu vết ngăn xếp
Buddy

1
@SignoffTeamz Bạn chỉ có thể đọc tài liệu. Đó là một số nhận dạng hiển thị nhật ký giúp bạn lọc nhật ký dễ dàng hơn và xem ứng dụng nào (và phần nào của nó) đã viết thông báo. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike

52

Chức năng trợ giúp này cũng hoạt động tốt vì Exception cũng là một Throwable .

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }

Nó là một chuỗi được sử dụng để chỉ định ứng dụng và vị trí. Bất kỳ chuỗi nào sẽ làm ở đó.
George

8
catch (Exception e) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  PrintStream stream = new PrintStream( baos );
  e.printStackTrace(stream);
  stream.flush();
  Log.e("MYAPP", new String( baos.toByteArray() );
}

Hoặc ... ya biết ... EboMike đã nói gì.


3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}

2

e.printStackTrace () in nó cho tôi. Tôi không nghĩ rằng bạn đang chạy logcat một cách chính xác. Đừng chạy nó trong một trình bao, chỉ chạy

/home/dan/android-sdk-linux_x86/tools/adb logcat


1

Đầu ra chuẩn và đầu ra lỗi được chuyển hướng đến / dev / null theo mặc định nên tất cả đều bị mất. Nếu bạn muốn ghi lại kết quả này thì bạn cần làm theo hướng dẫn "Xem stdout và stderr" được hiển thị ở đây


1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}

0

Trong bối cảnh của Android, tôi phải truyền Ngoại lệ thành một chuỗi:

try {
    url = new URL(REGISTRATION_PATH);
    urlConnection = (HttpURLConnection) url.openConnection();
} catch(MalformedURLException e) {
    Log.i("MALFORMED URL", String.valueOf(e));
} catch(IOException e) {
    Log.i("IOException", String.valueOf(e));
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.