තොග හෝඩුවාවක් නූලකට පරිවර්තනය කරන්නේ කෙසේද?


1514

Throwable.getStackTrace()ප්‍රති result ලය ස්ටක්ට්‍රේස් නිරූපණය කරන නූලකට පරිවර්තනය කිරීමට ඇති පහසුම ක්‍රමය කුමක්ද?


6
මන්ද, jqno ගේ පිළිතුර ඇත්ත වශයෙන්ම ඔබේ ප්‍රශ්නයේ ඔබ සඳහන් කළ Throwable.getStackTrace () ක්‍රමය භාවිතා කරන අතර බ්‍රයන් එසේ නොකරයි. ඔහු ඒ වෙනුවට Throwable.printStackTrace () භාවිතා කරයි.
ස්ටිජන් ඩි විට්

10
සෑම ජාවා ව්‍යාපෘතියකටම Apache commons-lang ඇතුළත් විය යුතුය. අතිශයින්ම පොදු සංවර්ධන අවශ්‍යතා ක්‍රියාත්මක කරන බොහෝ පහසු ක්‍රම එයට ඇතුළත් ය.
රසල් සිල්වා

20
@StijndeWitt එම කේත පේළි තුනට ඔබ ඇමතූ ස්ථානයෙන් පිටත සාධක අවශ්‍ය වේ. ඒවා තැබිය යුත්තේ කොතැනදැයි ඔබ නොදන්නා බැවින්, ඔවුන් අනෙක් සියලුම ප්‍රයෝජනවත් ස්නිපෙට් සමඟ ඔබේ උපයෝගිතා මෙවලම් පෙට්ටියට යයි. බිංගෝ! ඔබ දැන් ගුවා / කොමන්ස්-ලැන්ග් / ඕනෑම දෙයක් නැවත සොයාගෙන ඇත ... එතරම් හොඳින් නොවේ. ඒ වෙනුවට සංවේදී උපයෝගිතා පුස්තකාලයක් ආයාත කර රෝදය ප්‍රතිනිර්මාණය කිරීම සුරකින්න. නවකයකුගේ සැබෑ ලකුණ වන්නේ පුස්තකාල ලේඛකයින්ට වඩා හොඳ කාර්යයක් කළ හැකි යැයි සිතීමයි.
ඇන්ඩ rew ස්පෙන්සර්

7
1. ගුවා සතුව ඇත - Throwables.getStackTraceAsString (e) 2. Apache Commons Lang - ExceptionUtils.getFullStackTrace 3. අපේම අභිරුචි ක්‍රම ලියන්න
user2323036

8
Nd ඇන්ඩ rew ස්පෙන්සර් කුඩා ස්නිපටයක් සමඟ මෙය සාක්ෂාත් කර ගැනීමට අවශ්‍ය නිසා ඔබ ස්ටිජ්ඩෙවිට්ට පහර දීමට මෙතරම් උත්සාහ කරන්නේ මන්දැයි මට තේරෙන්නේ නැත. ඉතා කුඩා උපයෝගීතා ක්‍රමයක් ලිවීමේදී එතරම් අනතුරක් නොමැත (මම එය "SHEER ARROGANCE oh nooooo !! ඔහු සිතන්නේ ඔහු Apache ට වඩා හොඳයි !!"). විශේෂයෙන් ජාවා නොවන ජේවීඑම් නොවන භාෂාවල ටොන් ගණනක් ව්‍යාපෘති තිබේ, ඒවා ගුවා හෝ කොමන්ස් ලැන්ග් ඇතුළත් කිරීමට අවශ්‍ය නැත. මම Scala & Clojure පුස්තකාල ලියන අතර නිසැකවම Apache Commons Lang එක එක් ක්‍රමයක් සඳහා පමණක් සංක්‍රාන්ති පරායත්තතාවයක් බවට පත් නොකරනු ඇත.
jm0

Answers:


1048

Exceptionතොග හෝඩුවාවක් පරිවර්තනය කිරීමට කෙනෙකුට පහත ක්‍රමය භාවිතා කළ හැකිය String. මෙම පන්තිය අපාචේ කොමන්ස්-ලැන්ග් හි ඇත, එය බොහෝ ජනප්‍රිය විවෘත ප්‍රභවයන් සහිත යැපෙන පුස්තකාලයකි

org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)


88
@ ස්ටිජන් - සාධාරණ වීමට (මම දැනට වැඩිම ඡන්දය දුන් පිළිතුර පහතින් ලියා ඇත) තවත් බොහෝ ක්‍රියාකාරකම් සඳහා කොමන්ස්-ලැන්ග් දෙස බැලීම වටී
බ්‍රයන් ඇග්නිව්

54
@ ස්ටීජ්ඩෙවිට් කොමන්ස් ලැන්ග් බහුලව දක්නට ලැබේ. එය දැනටමත් මගේ බොහෝ ව්‍යාපෘති / වැඩ කරන ස්ථානවල පවතී.
WhyNotHugo

16
Ug හියුගෝ ස්තූතියි, නව පුස්තකාලයක් එක් කිරීම වළක්වා ගැනීම සඳහා StringWriter භාවිතා කිරීමට යනවා - එය දැනටමත් මගේ පරායත්තතා 3 න් යැපීමකි. එබැවින් ඉතිරිය වෙත, ඔබ සතුව දැනටමත් එය තිබේදැයි පරීක්ෂා කරන්න.
නතානියල්

33
Ar මාටින් ඇසෙනොව් - ඔබේ තර්කනය අනුගමනය කරමින් ඔබ කිසි විටෙකත් එවැනි පුස්තකාලයක් භාවිතා නොකරනු ඇත. ඔබ දැනටමත් එය භාවිතා නොකරන්නේ නම් ඔබ එය භාවිතා නොකරන්නේද?
බ්‍රයන් ඇග්නිව්

16
Fyi, පැකේජය වෙනස් වී ඇති අතර පන්තිය දැන් ඇත්තේ : org.apache.commons.lang3.exception.ExceptionUtils.
schmmd

2211

Throwable.printStackTrace(PrintWriter pw)සුදුසු ලේඛකයෙකුට තොග හෝඩුවාව යැවීමට භාවිතා කරන්න .

import java.io.StringWriter;
import java.io.PrintWriter;

// ...

StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); // stack trace as a string
System.out.println(sStackTrace);

508
මේ තරම් කුඩා හා සරල දෙයක් සඳහා බාහිර පුස්තකාලයක් ඇතුළත් කිරීමට ඔබ අකමැති නම්, මෙම පිළිතුර භාවිතා කරන්න.
ස්ටිජන් ඩි විට්

8
මෙය මුද්‍රණ පථය () ​​මුද්‍රණය කරයි. තොගයේ ඇති සියලුම ව්‍යතිරේක දෘශ්‍යමාන නමුත් එක් එක් ව්‍යතිරේකය සඳහා තොගය කපා දැමිය හැකිය. සම්පූර්ණ හෝඩුවාව අවශ්‍ය ඕනෑම අයෙකු මෙය සලකා බැලිය යුතුය.
ලයිලා අගෙව්

5
මෙය, පෙනෙන ආකාරයට, අපාචේගේ ExceptionUtils.getStackTrace () ක්‍රමය කරන්නේ හරියටම ය. ඇත්ත වශයෙන්ම ලිපියට පාහේ.
ටික්ටොක්

6
@BrianAgnew, ඔබ වසා නොකළ යුතුය StringWriterහා PrintWriter?
මුහම්මද් ගෙල්බානා

13
Rian බ්‍රයන් ඇග්නිව්, පිළිතුරට ස්තූතියි. එය මට කුතුහලයක් ඇති කළ අතර මා සොයාගත් දේ මෙන්න: stackoverflow.com/questions/14542535/…
මුහම්මද් ගෙල්බානා

460

මෙය ක්‍රියාත්මක විය යුතුය:

StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();

69
ජාවා සන්දර්භය තුළ සංක්ෂිප්තව සෑම විටම හාස්‍යජනක ය. එය printStackTraceමුද්‍රණය කළ යුතුද නැද්ද යන්න පිළිබඳ තීරණයක් තබා පරිශීලකයා වෙත ආපසු යා යුතුය :)
දිමිත්‍රි

37
printStackTrace කොන්සෝලය තුළ මුද්‍රණය කිරීම පිළිගත හැකි නමුත් අවම වශයෙන් getStackTrace එය සංගීත භාණ්ඩයක් ලෙස ආපසු ලබා දීම පෙරනිමියෙන් ලබා ගත යුතුය
Mateus Viccari

5
සංක්ෂිප්ත වන්නේ මෙහි කුමන කොටසද? තොග හෝඩුවාව නූලකට දැමීම හැර වෙනත් කිසිදු අරමුණක් සඳහා ඔබ වස්තු 2 ක් සෑදිය යුතුය.
ArtOfWarfare

7
mitdmitry යනුවෙන් හැඳින්වෙන ක්‍රමයක් printXXX()XXX මුද්‍රණය කළ යුතුය.
මාර්ක්විස් ඔෆ් ලෝර්න්

2
Reg ග්‍රෙග් ඇත්ත වශයෙන්ම එය උපහාසයක් පවා නොවීය, එයට ඔහු පැවසූ දේ පැහැදිලිව කියවීම අවශ්‍ය විය.
ඇන්ඩෲ

228

ඔබ ඇන්ඩ්‍රොයිඩ් සඳහා සංවර්ධනය කරන්නේ නම්, මෙය භාවිතා කිරීම වඩා පහසු ක්‍රමයකි:

import android.util.Log;

String stackTrace = Log.getStackTraceString(exception); 

ආකෘතිය getStacktrace හා සමාන වේ, උදා

09-24 16:09:07.042: I/System.out(4844): java.lang.NullPointerException
09-24 16:09:07.042: I/System.out(4844):   at com.temp.ttscancel.MainActivity.onCreate(MainActivity.java:43)
09-24 16:09:07.042: I/System.out(4844):   at android.app.Activity.performCreate(Activity.java:5248)
09-24 16:09:07.043: I/System.out(4844):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.access$800(ActivityThread.java:139)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Handler.dispatchMessage(Handler.java:102)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Looper.loop(Looper.java:136)
09-24 16:09:07.044: I/System.out(4844):   at android.app.ActivityThread.main(ActivityThread.java:5097)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invokeNative(Native Method)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invoke(Method.java:515)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)

2
ස්තූතියි. මෙම අවස්ථාවේදී printStackTrace () හි මෙන් සෑම පේළියකම දිනයක් සහ ටැගයක් ලියා නොමැත.
CoolMind

1
ඇත්ත වශයෙන්ම Log.getStackTraceString එහි හරය තුළ ඉහත සඳහන් (D. Wroblewski's) StringWriter සහ Printwriter භාවිතා කරයි.
මයික්එල්

2
ඇන්ඩ්‍රොයිඩ් ලොගයේ එය මුද්‍රණය කිරීමට ඇති පහසුම ක්‍රමය නම්: Log.e("TAG", "My message", new Throwable());
එරික් එම්. ස්ප්‍රෙන්ජල්


113

අවවාදයයි: හේතුව ඇතුළත් නොවේ (එය සාමාන්‍යයෙන් ප්‍රයෝජනවත් බිට් වේ!)

public String stackTraceToString(Throwable e) {
    StringBuilder sb = new StringBuilder();
    for (StackTraceElement element : e.getStackTrace()) {
        sb.append(element.toString());
        sb.append("\n");
    }
    return sb.toString();
}

1
ඔබට හෝඩුවාව අඩු කිරීමට අවශ්‍ය නම් මම මෙම ප්‍රවේශයේ දිගුවක් සමඟ යන්නෙමි, උදා: මැක්ස්ලයින් පරාමිතියක් පසු කර එම රේඛාවට බොහෝ රේඛා එක් කරන්න
රිච්

E.getStackTrace පසු වරහන් වර්‍ග නොමැත. පොදු ස්ථිතික String stackTraceToString (ව්‍යතිරේකය ඉ) {StringBuilder sb = නව StringBuilder (); සඳහා (StackTraceElement element: e.getStackTrace ()) b sb.append (element.toString ()); sb.append ("<br />"); } ආපසු sb.toString (); }
rlc

2
විශ්වාස නැත, නමුත් මම සිතන්නේ මෙය මූල හේතු ව්‍යතිරේකයේ තොග හෝඩුවාව මුද්‍රණය නොකරනු ඇත.
apoorv020

7
ඔබ කුමක් කළත්, හෝඩුවාව කපන්න එපා. ග්ලාස්ෆිෂ් ල logs ු-සටහන් වල ඇති කොටස් හෝඩුවාවක් දෙස බැලූ විට මට ප්‍රයෝජනවත් කොටස් ඉවතට විසිවී ගොස් ඇත.
cayhorstmann

ඩොස් ලැමර්ස් සතුටු කිරීම String.format("%n")වෙනුවට ඒ හා සමාන දෙයක් භාවිතා කරන්න "\n".
ceving

91

මට නම් පිරිසිදු හා පහසුම ක්‍රමය වූයේ:

import java.util.Arrays;
Arrays.toString(e.getStackTrace());

37
කේතය පිරිසිදුයි, නමුත් ප්‍රතිදානය එසේ නොවේ. ඔබ අවසානයේ .replaceAll (",", "\ n") කළ යුතුය. කෙසේ වෙතත්, printStackTrace විසින් යෝජනා කරන ලද ඉන්ඩෙන්ටේෂන් ඔබට අහිමි වේ.
කෝපය

4
ඔබ තනි පේළියක හෝඩුවාවක් ලොග් කරන විට මෙය ප්‍රයෝජනවත් වේ
වෙබ් ජොකී

29
public static String getStackTrace(Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}

1
හායි, මම පෙන්වා දීමට කැමතියි පිළිතුරේ අදහස් දැක්වීමේ කොටස පෙන්වා දෙන්නේ වස්තූන් StringWriterහා PrintWriterවස්තූන් විය යුතු බවයි close.... (නැතහොත් PrintWriterඑය වසා දැමිය යුතු බැවින් වසා දැමිය යුතු අවශ්‍යතා පමණක් වසා දැමිය යුතු යැයි මම සිතමි StringWriter)
එරික්

8
දේවානුභාවයෙන් ඔබ අදහස් කළේ පිටපත් කළාද? ඔබ එය තැබුවේ ක්‍රමයකට පමණි ... මෙහි පිළිතුරු කියවීම හරියට “
ග්‍රවුන්ඩ්හෝග්

26

StringLog4J වැනි API භාවිතා නොකර හෝ සම්පූර්ණ ස්ටැක්ට්‍රේස් ආකෘතියකින් ලබා ගැනීමට පහත කේතය ඔබට ඉඩ දෙයි java.util.Logger:

catch (Exception e) {
    StackTraceElement[] stack = e.getStackTrace();
    String exception = "";
    for (StackTraceElement s : stack) {
        exception = exception + s.toString() + "\n\t\t";
    }
    System.out.println(exception);
    // then you can send the exception string to a external file.
}

1
ඔව්, නමුත් එය ටිකක් විශාලයි කියා ඔබ සිතන්නේ නැද්ද? ඕනෑම සාධාරණ ප්‍රමාණයේ ව්‍යාපෘති
ල ging ු

මෙය ආරම්භයේ දී දෝෂ පණිවිඩය ලබා නොදේ. එකතු කළ හැකි වුවද
kommradHomer

සරල සම්මුතියක් වෙනුවට ඔබට StringBuffer භාවිතා කිරීමට අවශ්‍ය විය හැකිය.
dedda1994

රහස්‍යතා හේතූන් මත පණිවිඩය ලොග් වීමට ඔබට ඉඩ නොදෙන විට මෙය ප්‍රයෝජනවත් වේ.
A1m

මෙම විසඳුම අභ්‍යන්තර හේතූන්
නොසලකා හරින බව මතක තබා ගන්න

19

කේතයට කෙලින්ම පිටපත් කළ හැකි අනුවාදයක් මෙන්න:

import java.io.StringWriter; 
import java.io.PrintWriter;

//Two lines of code to get the exception into a StringWriter
StringWriter sw = new StringWriter();
new Throwable().printStackTrace(new PrintWriter(sw));

//And to actually print it
logger.info("Current stack trace is:\n" + sw.toString());

නැතහොත්, අල්ලා ගැනීමේ කොටසක

} catch (Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    logger.info("Current stack trace is:\n" + sw.toString());
}

මෙය වත්මන් ශ්‍රිතයේ සීමාවෙන් ඔබ්බට පවතිනු ඇත, එනම්. කොහෙද Throwableඅර්ථ දක්වන්නේ, හරිද?
n611x007

16
Arrays.toString(thrown.getStackTrace())

ප්‍රති result ලය නූල් බවට පරිවර්තනය කිරීමට ඇති පහසුම ක්‍රමය මෙයයි. මම මෙය මගේ වැඩසටහනේ භාවිතා කරන්නේ තොග හෝඩුවාව මුද්‍රණය කිරීමට ය

LOGGER.log(Level.SEVERE, "Query Builder Issue Stack Trace : {0} ,Message : {1} objid {2}", new Object[]{Arrays.toString(e.getStackTrace()), e.getMessage(),objId});

මා වෙනුවෙන් වැඩ කර ඇත, කිසිවක් කැපූ බවක් නොපෙනේ! වෙනත් බාහිර පුස්තකාලයකට වඩා සරලයි, ඕනෑම බාහිර පුස්තකාලයක්, විශිෂ්ට පිළිතුරක්!
ෂෝං චෙං

16

තොග හෝඩුවාව a ට මුද්‍රණය කර PrintStreamඑය a බවට පරිවර්තනය කරන්න String:

// ...

catch (Exception e)
{
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    e.printStackTrace(new PrintStream(out));
    String str = new String(out.toByteArray());

    System.out.println(str);
}

1
මෙය වඩාත්ම සෘජු පිළිතුරයි
DaSqy Stc

11

සිරස් අතට හෝඩුවාවක් මුද්‍රණය කිරීම

import java.io.PrintWriter;
import java.io.StringWriter;

public class StackTraceUtils {
    public static String stackTraceToString(StackTraceElement[] stackTrace) {
        StringWriter sw = new StringWriter();
        printStackTrace(stackTrace, new PrintWriter(sw));
        return sw.toString();
    }
    public static void printStackTrace(StackTraceElement[] stackTrace, PrintWriter pw) {
        for(StackTraceElement stackTraceEl : stackTrace) {
            pw.println(stackTraceEl);
        }
    }
}

නිදසුනක් භාවිතා නොකර වත්මන් නූල් තොග හෝඩුවාව මුද්‍රණය කිරීමට ඔබට අවශ්‍ය විට එය ප්‍රයෝජනවත් වේ Throwable- නමුත් නව Throwableසහ තැනින් තැන හෝඩුවාවක් ලබා ගැනීම ඇමතීමට වඩා වේගවත් හා ලාභදායී බව සලකන්න Thread.getStackTrace.


11

කොට්ලින්

විසි කළ හැකි පන්තිය දීර් ing කිරීමෙන් ඔබට සංගීත දේපල ලැබෙනු ඇත error.stackTraceString:

val Throwable.stackTraceString: String
  get() {
    val sw = StringWriter()
    val pw = PrintWriter(sw)
    this.printStackTrace(pw)
    return sw.toString()
  }

10
private String getCurrentStackTraceString() {
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    return Arrays.stream(stackTrace).map(StackTraceElement::toString)
            .collect(Collectors.joining("\n"));
}

1
ස්තූතියි eddyrkokr! එය මගේ සියලු වගන්ති සඳහා පරිපූර්ණව ක්‍රියා කරයි. මම එය මූලික ටෙස්ට්එන්ජී පන්තියට එකතු කර ඇති අතර එය මගේ සියලු පරීක්ෂණ වලින් එකින් එක සිරස් අතට එකතු කරයි!
Krzysztof Walczewski

9

පළමු අදහස් දැක්වීමේදී ඉතා දක්ෂ ලෙස විනිවිද යාම ඉතා විනෝදජනක විය, නමුත් එය සැබවින්ම රඳා පවතින්නේ ඔබ කිරීමට උත්සාහ කරන දේ මතය. ඔබට දැනටමත් නිවැරදි පුස්තකාලයක් නොමැති නම්, කේත පේළි 3 ක් (ඩී. වර්බ්ලෙව්ස්කිගේ පිළිතුරෙහි මෙන්) පරිපූර්ණයි. OTOH, ඔබට දැනටමත් apache.commons පුස්තකාලය තිබේ නම් (බොහෝ විශාල ව්‍යාපෘති වලට අනුව), එවිට අමර්ගේ පිළිතුර කෙටි වේ. හරි, පුස්තකාලය ලබාගෙන එය නිවැරදිව ස්ථාපනය කිරීමට ඔබට විනාඩි දහයක් ගතවනු ඇත (ඔබ කරන්නේ කුමක්දැයි ඔබ දන්නේ නම් එකකට වඩා අඩුය). නමුත් ඔරලෝසුව හීලෑ වේ, එබැවින් ඔබට ඉතිරි කිරීමට කාලය නොමැති විය හැකිය. ජැරෙක් ප්‍රසිගාඩ්ස්කි සිත්ගන්නාසුලු අවවාදයක් - “ඔබට කැදැලි ව්‍යතිරේක අවශ්‍ය නොවේ නම්”.

නමුත් මට සම්පූර්ණ කූඩාරම්, කූඩු සහ සියල්ල අවශ්‍ය නම් කුමක් කළ යුතුද? එවැනි අවස්ථාවකදී රහස වන්නේ apache.common හි getFullStackTrace භාවිතා කිරීමයි ( http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html බලන්න # getFullStackTrace% 28java.lang.Throwable% 29 )

ඒකෙන් මගේ බේකන් බේරුණා. ස්තූතියි, අමර්, ඉඟිය සඳහා!


9

Apache Commons Lang 3.4 ( JavaDoc ) වෙතින් කේතය :

public static String getStackTrace(final Throwable throwable) {
    final StringWriter sw = new StringWriter();
    final PrintWriter pw = new PrintWriter(sw, true);
    throwable.printStackTrace(pw);
    return sw.getBuffer().toString();
}

අනෙක් පිළිතුරු සමඟ ඇති වෙනස නම් එය භාවිතා autoFlush කරන්නේ PrintWriter.


8

java.io.*එය නොමැතිව මේ ආකාරයෙන් කළ හැකිය.

String trace = e.toString() + "\n";                     

for (StackTraceElement e1 : e.getStackTrace()) {
    trace += "\t at " + e1.toString() + "\n";
}   

එවිට traceවිචල්‍යය ඔබේ තොග හෝඩුවාව රඳවා ගනී. ප්‍රතිදානය ද ආරම්භක හේතුව දරයි, ප්‍රතිදානය සමාන වේprintStackTrace()

උදාහරණය, printStackTrace()අස්වැන්න:

java.io.FileNotFoundException: / (Is a directory)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
    at Test.main(Test.java:9)

මෙම traceසංගීත, මුද්රණය විට පවත්වයිstdout

java.io.FileNotFoundException: / (Is a directory)
     at java.io.FileOutputStream.open0(Native Method)
     at java.io.FileOutputStream.open(FileOutputStream.java:270)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
     at Test.main(Test.java:9)

5

පරිමාණ අනුවාදය

def stackTraceToString(e: Exception): String = {
  import java.io.PrintWriter
  val sw = new StringWriter()
  e.printStackTrace(new PrintWriter(sw))
  sw.toString
}

5

ඔබ ජාවා 8 භාවිතා කරන්නේ නම්, මෙය උත්සාහ කරන්න

Arrays.stream(e.getStackTrace())
                .map(s->s.toString())
                .collect(Collectors.joining("\n"));

පහත පරිදි getStackTrace()සපයනු ලබන ශ්‍රිතය සඳහා කේතය ඔබට සොයාගත හැකිය Throwable.java:

public StackTraceElement[] getStackTrace() {
    return getOurStackTrace().clone();
}

සහ StackTraceElement, එය සපයන්නේ toString():

public String toString() {
    return getClassName() + "." + methodName +
        (isNativeMethod() ? "(Native Method)" :
         (fileName != null && lineNumber >= 0 ?
          "(" + fileName + ":" + lineNumber + ")" :
          (fileName != null ?  "("+fileName+")" : "(Unknown Source)")));
}

එබැවින් StackTraceElement"\ n" සමඟ සම්බන්ධ වන්න.


මෙම විසඳුම ස්ටැක් ට්‍රේස් ටැබ් ඉන්ඩෙන්ට් වලට ගරු නොකරයි, එසේ නොමැතිනම් එය විශිෂ්ට ලෙස ක්‍රියා කරයි!
krizajb

5

ජාවා 8 ධාරා API සමඟ ඔබට මේ වගේ දෙයක් කළ හැකිය:

Stream
    .of(throwable.getStackTrace())
    .map(StackTraceElement::toString)
    .collect(Collectors.joining("\n"));

එය සිරස් ලුහු ce ු මූලද්‍රව්‍ය සමූහයක් ගෙන ඒවා නූල් බවට පරිවර්තනය කර බහු රේඛා වලට සම්බන්ධ වේ.


2
මෙම විසඳුම පණිවිඩය ඉවත් කිරීම වන අතර සියලු මව්
හෝඩුවාවන්

4

ගාලාගේ පිළිතුරෙහි විස්තාරණයක් වන අතර එය ව්‍යතිරේකයට හේතු ද ඇතුළත් වේ:

private String extrapolateStackTrace(Exception ex) {
    Throwable e = ex;
    String trace = e.toString() + "\n";
    for (StackTraceElement e1 : e.getStackTrace()) {
        trace += "\t at " + e1.toString() + "\n";
    }
    while (e.getCause() != null) {
        e = e.getCause();
        trace += "Cause by: " + e.toString() + "\n";
        for (StackTraceElement e1 : e.getStackTrace()) {
            trace += "\t at " + e1.toString() + "\n";
        }
    }
    return trace;
}

4

විසඳුම වන්නේ අරා ස්ටැක්ට්‍රේස් නූල් දත්ත වර්ගයට පරිවර්තනය කිරීමයි . පහත උදාහරණය බලන්න:

import java.util.Arrays;

try{

}catch(Exception ex){
    String stack = Arrays.toString(ex.getStackTrace());
    System.out.println("stack "+ stack);
}

3

සංවෘත බහු රේඛා නූලට තොග හෝඩුවාව පරිවර්තනය කිරීමට මගේ ඔනලයිනර්:

Stream.of(e.getStackTrace()).map((a) -> a.toString()).collect(Collectors.joining("\n", "[", "]"))

"පවතින ආකාරයට" ලොගර් වෙත යැවීම පහසුය.


ඔබට වඩා වෙනස් දෙයක් printStackTrace()ඔබට මෙහි ලැබෙනු ඇත: 1) විසි කළ ව්‍යතිරේකය; 2) හේතු සහ ඒවායේ සිරස් තලය
valijon

printStackTrace()කිසි විටෙකත් පරිවර්තනය කිරීම ප්‍රශ්නයේ කොටසක් නොවූ හෙයින් වෙනස තරමක් අපේක්ෂා කෙරේ .
ඇන්ඩ්‍රි ලෙබෙඩෙන්කෝ

2

ඔබට බාහිර පුස්තකාලයක් භාවිතා කිරීමට අවශ්‍ය නැතිනම් ඔබ ඇන්ඩ්‍රොයිඩ් සඳහා සංවර්ධනය නොකරන්නේ නම් , ඔබට මෙවැනි 'දිගුවක්' ක්‍රමයක් නිර්මාණය කළ හැකිය :

public static String getStackTraceString(Throwable e) {
    return getStackTraceString(e, "");
}

private static String getStackTraceString(Throwable e, String indent) {
    StringBuilder sb = new StringBuilder();
    sb.append(e.toString());
    sb.append("\n");

    StackTraceElement[] stack = e.getStackTrace();
    if (stack != null) {
        for (StackTraceElement stackTraceElement : stack) {
            sb.append(indent);
            sb.append("\tat ");
            sb.append(stackTraceElement.toString());
            sb.append("\n");
        }
    }

    Throwable[] suppressedExceptions = e.getSuppressed();
    // Print suppressed exceptions indented one level deeper.
    if (suppressedExceptions != null) {
        for (Throwable throwable : suppressedExceptions) {
            sb.append(indent);
            sb.append("\tSuppressed: ");
            sb.append(getStackTraceString(throwable, indent + "\t"));
        }
    }

    Throwable cause = e.getCause();
    if (cause != null) {
        sb.append(indent);
        sb.append("Caused by: ");
        sb.append(getStackTraceString(cause, indent));
    }

    return sb.toString();
}

2

පරණ ප්‍රශ්නය, නමුත් මම ඔබට අවශ්‍ය සියලුම කොටස් මුද්‍රණය කිරීමට අකමැති විශේෂ අවස්ථාව එකතු කිරීමට කැමතියි සමහර පංති හෝ පැකේජ හැර ඔබ සැබවින්ම උනන්දුවක් නොදක්වන සමහර කොටස් ඉවත් කිරීමෙන් ඔබට .

ඒ වෙනුවට ක PrintWriterභාවිතය SelectivePrintWriter:

// This filters out this package and up.
String packageNameToFilter = "org.springframework";

StringWriter sw = new StringWriter();
PrintWriter pw = new SelectivePrintWriter(sw, packageNameToFilter);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); 
System.out.println(sStackTrace);

SelectivePrintWriterපංතිය ලබා දෙන්නේ කොහෙන්ද :

public class SelectivePrintWriter extends PrintWriter {
    private boolean on = true;
    private static final String AT = "\tat";
    private String internal;

    public SelectivePrintWriter(Writer out, String packageOrClassName) {
        super(out);
        internal = "\tat " + packageOrClassName;
    }

    public void println(Object obj) {
        if (obj instanceof String) {
            String txt = (String) obj;
            if (!txt.startsWith(AT)) on = true;
            else if (txt.startsWith(internal)) on = false;
            if (on) super.println(txt);
        } else {
            super.println(obj);
        }
    }
}

මෙම පංතිය රීජෙක්ස් containsහෝ වෙනත් නිර්ණායක මඟින් පෙරීමට පහසුවෙන් අනුගත විය හැකි බව කරුණාවෙන් සලකන්න . එය Throwableක්‍රියාත්මක කිරීමේ තොරතුරු මත රඳා පවතින බව සලකන්න (වෙනස් වීමට ඉඩක් නැත, නමුත් තවමත්).


1
ඔව්, මෙය හොඳින් ක්‍රියාත්මක වන අතර ඇත්ත වශයෙන්ම එය ප්‍රයෝජනවත් අදහසකි.
gil.fernandes

2
 import java.io.PrintWriter;
import java.io.StringWriter;

public class PrintStackTrace {

    public static void main(String[] args) {

        try {
            int division = 0 / 0;
        } catch (ArithmeticException e) {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            String exceptionAsString = sw.toString();
            System.out.println(exceptionAsString);
        }
    }
}

ඔබ වැඩසටහන ක්‍රියාත්මක කරන විට, ප්‍රතිදානය සමාන දෙයක් වනු ඇත:

java.lang.ArithmeticException: / by zero
at PrintStackTrace.main(PrintStackTrace.java:9)

1

කිසිවෙකු සඳහන් නොකළේ මන්දැයි මම කල්පනා කරමි ExceptionUtils.getStackFrames(exception)

මට නම් එය සියළුම හේතුන් සමඟ ස්ටැක්ට්‍රේස් අවසානය දක්වා ඉවත ලෑමට වඩාත් පහසුම ක්‍රමයයි:

String.join("\n", ExceptionUtils.getStackFrames(exception));

0

අවවාදයයි: මෙය ටිකක් මාතෘකාවක් විය හැකිය, නමුත් ඔහ් හොඳයි ...;)

මුල් පෝස්ටරයේ හේතුව කුමක්දැයි මම නොදනිමි . සිරස් හෝඩුවාව SLF4J / Logback LOG එකකින් අවසන් විය යුතු නමුත්, ව්‍යතිරේකයක් හෝ විසි නොකළ යුතු විට මා කරන්නේ එයයි:

public void remove(List<String> ids) {
    if(ids == null || ids.isEmpty()) {
        LOG.warn(
            "An empty list (or null) was passed to {}.remove(List). " +
            "Clearly, this call is unneccessary, the caller should " + 
            "avoid making it. A stacktrace follows.", 
            getClass().getName(),
            new Throwable ("Stacktrace")
        );

        return;
    }

    // actual work, remove stuff
}

මම එයට කැමතියි එයට බාහිර පුස්තකාලයක් අවශ්‍ය නොවන නිසා (ඔබේ ල ging ු-සටහන් පසුබිම හැර, එය බොහෝ විට බොහෝ විට ක්‍රියාත්මක වනු ඇත, ඇත්ත වශයෙන්ම).


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.