আমি স্ট্যাক ট্রেসকে স্ট্রিংয়ে কীভাবে রূপান্তর করতে পারি?


1501

Throwable.getStackTrace()স্ট্যাকট্রেস চিত্রিত করে এমন একটি স্ট্রিংয়ের ফলাফলকে রূপান্তরিত করার সহজতম উপায় কী ?


6
কারণ jqno এর উত্তরটি আসলে আপনার প্রশ্নে নির্দিষ্ট করে থাকা Throwable.getStackTrace () পদ্ধতি ব্যবহার করে, যেখানে ব্রায়ান তা দেয় না। পরিবর্তে তিনি থ্রোয়েবল.প্রিন্টস্ট্যাকট্রেস () ব্যবহার করেন।
স্টিজন ডি উইট

10
প্রায় প্রতিটি জাভা প্রকল্পে অ্যাপাচি কমন্স-ল্যাং অন্তর্ভুক্ত করা উচিত। এটিতে প্রচলিত সাধারণ উন্নয়নের প্রয়োজনগুলি বাস্তবায়িত করার সুবিধার্থে অনেকগুলি পদ্ধতি রয়েছে।
রাসেল সিলভা

20
@ স্টিজেডেভিট এই তিনটি লাইন কোডের প্রায় নিশ্চিতভাবেই আপনি যে জায়গাগুলি ডেকেছেন সেখান থেকে ফ্যাক্টরিং করা দরকার। যেহেতু আপনি এগুলি রাখবেন জানেন না, তারা আপনার অন্যান্য ইউটিলিটি সরঞ্জাম বাক্সে সমস্ত অন্যান্য দরকারী স্নিপকেট সহ যাবেন। বিঙ্গো! আপনি কেবল পেয়ারা / কমন্স-ল্যাং / যা কিছু পুনর্নবীকরণ করেছেন ... কেবল এত ভাল নয়। পরিবর্তে একটি বুদ্ধিমান ইউটিলিটিস লাইব্রেরি আমদানি করুন, এবং চাকা পুনরায় উদ্ভাবন সংরক্ষণ করুন। নবজাতকের আসল চিহ্নটি ভাবছে আপনি গ্রন্থাগারের লেখকদের চেয়ে ভাল কাজ করতে পারেন।
অ্যান্ড্রু স্পেন্সার

6
1. পেয়ারাতে রয়েছে - থ্রোয়েবস.জেটস্ট্যাকট্রেসএস্ট্রিং (ঙ) 2. অ্যাপাচি কমন্স ল্যাং - এক্সেপশনস
ইউটিস.সেটফুলস্ট্যাকট্রেস

8
@ অ্যান্ড্রুস্পেনসর আমি বুঝতে পারছি না যে আপনি ছেলেরা কিছু ছোট ছোট স্নিপেটের সাহায্যে এটি অর্জন করার জন্য স্টিঞ্জিউইটকে ধাক্কা দেওয়ার জন্য কেন এত কঠোর প্রচেষ্টা করেছেন। একটি ক্ষুদ্রতর ইউটিলিটি পদ্ধতি লেখার ক্ষেত্রে আসলে খুব বেশি বিপদ নেই (আমি এটিকে "শির অ্যারগানস ওহ নুওও হিসাবে দেখি না! তিনি মনে করেন যে তিনি আপাচে চেয়ে ভাল !!")। বিশেষত জাভা-বিহীন JVM ভাষাগুলিতে এমন অনেকগুলি প্রকল্প রয়েছে যা কেবল স্ট্যাকট্রেস লগ করার জন্য পেয়ারা বা কমন্স ল্যাং অন্তর্ভুক্ত করতে চায় না। আমি স্কালা এবং ক্লোজার লাইব্রেরি লিখি এবং অবশ্যই অ্যাপাচি কমন্স ল্যাংকে কেবল একটি পদ্ধতির জন্য ট্রানজিটিভ নির্ভরতা বানাবে না।
jm0

উত্তর:


1039

Exceptionস্ট্যাক ট্রেসকে রূপান্তর করতে কেউ নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন String। এই শ্রেণিটি অ্যাপাচি কমন্স-ল্যাংয়ে উপলভ্য যা অনেক জনপ্রিয় ওপেন সোর্স সহ সর্বাধিক সাধারণ নির্ভর লাইব্রেরি

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


88
@ স্টিজন - ন্যায্য হতে হবে (আমি নীচে বর্তমানের সবচেয়ে বেশি ভোট দেওয়া উত্তর লিখেছি) আরও অনেক কার্যকারিতার জন্য কমন্স-ল্যাংকে দেখার পক্ষে মূল্যবান
ব্রায়ান অগ্নিউ

54
@ স্টিজেডেভিট কমন্স ল্যাং খুব সাধারণ বিষয়। এটি ইতিমধ্যে আমার বেশিরভাগ প্রকল্পে / কর্মক্ষেত্রের মধ্যে উপস্থিত রয়েছে।
নটহাগো 21:51

16
@ হুগো ধন্যবাদ, একটি নতুন লাইব্রেরি যুক্ত এড়ানোর জন্য স্ট্রিং রাইটার ব্যবহার করতে যাচ্ছিল - এটি ইতিমধ্যে আমার 3 নির্ভরতার 3 এর একটি নির্ভরতা প্রমাণ করে। বাকিদের কাছে, আপনার কাছে এটি ইতিমধ্যে আছে কিনা তা পরীক্ষা করে দেখুন।
নাথানিয়াল

33
@ মার্টিনএসেনভ - আপনার যুক্তি অনুসরণ করে আপনি কখনও এই জাতীয় লাইব্রেরি ব্যবহার করবেন না, আপনি কি করবেন? আপনি যদি ইতিমধ্যে এটি ব্যবহার না করেন তবে আপনি এটি ব্যবহার করবেন না?
ব্রায়ান অ্যাগনিউ

15
FYI, প্যাকেজ পরিবর্তন করা হয়েছে এবং ক্লাস এখন হল: org.apache.commons.lang3.exception.ExceptionUtils
schmmd

2200

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);

505
আপনি যদি এর চেয়ে ছোট এবং সাধারণ কোনও জিনিসের জন্য কোনও বাহ্যিক গ্রন্থাগার অন্তর্ভুক্ত না করেন তবে এই উত্তরটি ব্যবহার করুন।
স্টিজন ডি উইট

8
এটি স্ট্যাক ট্রেসকে একইভাবে প্রিন্টস্ট্যাকট্রেস () ছাঁটাই করে তোলে। স্ট্যাকের সমস্ত ব্যতিক্রম দৃশ্যমান তবে প্রতিটি ব্যতিক্রমের জন্য স্ট্যাকটি ছাঁটাই করা যেতে পারে। যে কোনও ব্যক্তির পুরো ট্রেসটির প্রয়োজন এটি বিবেচনা করা উচিত।
লায়লা আগায়েভ

5
এটি, যেমন এটি দেখা যাচ্ছে, অ্যাপাচি এর এক্সসেপশনস ইউটিস.সেটস্ট্যাকট্রেস () পদ্ধতিটি ঠিক তেমনটি করে। প্রায় চিঠিটি আসলে।
ticktock

6
@ ব্রায়ানআগনেউ, আপনার কি বন্ধ করা উচিত নয় StringWriterএবং PrintWriter?
মুহাম্মদ জেলবানা 21

13
@ ব্রায়ান অ্যাগনেউ, উত্তরের জন্য ধন্যবাদ : এটা আমাকে কৌতূহলী হয়ে উঠি এবং এখানে আমি যা পাওয়া যায় stackoverflow.com/questions/14542535/...
মুহাম্মদ Gelbana

459

এই কাজ করা উচিত:

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

69
জাভা প্রসঙ্গে সংক্ষিপ্ততা সর্বদা হাস্যকর। এটি printStackTraceকেবল স্ট্রিংটি ফিরে আসে, এটি মুদ্রণ করা উচিত বা ব্যবহারকারীর কাছে নয় সে বিষয়ে সিদ্ধান্ত রেখে :)
দিমিত্রি

35
কনসোলে মুদ্রণযন্ত্রের মুদ্রণ গ্রহণযোগ্য, তবে স্ট্রিং হিসাবে এটি ফিরিয়ে ফেরা অন্তত একটি getStackTrace ডিফল্টরূপে পাওয়া উচিত
ম্যাটিউস ভিকারি

5
এর কোন অংশটি সংক্ষিপ্ত? আপনাকে স্ট্যাকের ট্রেসটিকে স্ট্রিংয়ে রাখার ব্যতীত অন্য কোনও উদ্দেশ্যে অস্তিত্বযুক্ত 2 টি অবজেক্ট তৈরি করতে হবে।
আর্টঅফ ওয়ারফেয়ার

7
@ ডিমেট্রি নামক একটি পদ্ধতিতে printXXX()XXX মুদ্রণ করা উচিত।
ব্যবহারকারী 207421

2
@ গ্রেগ আসলে এটি কৌতুকপূর্ণও ছিল না, এটির জন্য তিনি যা বলেছেন তা কেবল একটি সরল পাঠের প্রয়োজন।
অ্যান্ড্রু

224

যদি আপনি অ্যান্ড্রয়েডের জন্য বিকাশ করে থাকেন তবে এটির ব্যবহার করা আরও সহজ উপায়:

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
ধন্যবাদ। এক্ষেত্রে একটি তারিখ এবং ট্যাগ প্রিন্টস্ট্যাকট্রেস () এর মতো প্রতিটি সারিতে লেখা থাকে না।
কুলমাইন্ড

1
প্রকৃতপক্ষে লগ.গেটস্ট্যাক ট্র্যাসস্ট্রিং এর মূলটিতে উপরে বর্ণিত (ডি। ভ্রোলবউস্কির) স্ট্রিং রাইটার এবং প্রিন্ট রাইটার ব্যবহার করে।
মাইকেল

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
আমি যদি এই ট্রেসটি ছাঁটাতে চান তবে আমি এই পদ্ধতির বর্ধনের সাথে যাব, উদাহরণস্বরূপ একটি ম্যাক্সলাইনস পরামিতিটি পাস করুন এবং কেবলমাত্র ট্রেসটিতে অনেকগুলি লাইন যুক্ত করুন
রিচ সেলার

EgetStackTrace এর পরে প্যারেন্টিহেসগুলি অনুপস্থিত। পাবলিক স্ট্যাটিক স্ট্রিং স্ট্র্যাকট্রেস্টো স্ট্রিং (ব্যতিক্রম ই) {স্ট্রিংবুডার এসবি = নতুন স্ট্রিংবিল্ডার (); (স্ট্যাকট্রেসএলিমেন্ট উপাদান: e.getStackTrace ()) b sb.append (এলিমেন্ট.টোস্ট্রিং ()); sb.append ("<br />"); } sb.toString () রিটার্ন করুন; }
আরএলসি

2
নিশ্চিত নয়, তবে আমি মনে করি এটি মূল কারণ ব্যতিক্রমের স্ট্যাক ট্রেস মুদ্রণ করবে না।
apoorv020

7
আপনি যা করেন না কেন, ট্রেসটি ছাঁটাবেন না। এটি আমার সাথে অনেকবার হয়েছে, অনেকবার আমি গ্লাসফিশ লগগুলিতে স্ট্যাক ট্রেসের দিকে নজর দিয়েছিলাম যা দরকারী অংশগুলি ছাঁটাই করা হয়েছিল।
cayhorstmann

ডস ল্যামারকে খুশি করার String.format("%n")পরিবর্তে ব্যবহার করুন বা অনুরূপ কিছু "\n"
সিলিং

89

আমার কাছে সবচেয়ে পরিষ্কার ও সহজ উপায় ছিল:

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

37
কোডটি পরিষ্কার, তবে আউটপুটটি নয়। আপনাকে শেষ পর্যন্ত একটি .replaceAll (",", "\ n") করতে হবে। তবে আপনি প্রিন্টস্ট্যাকট্রেসের প্রস্তাবিত ইন্ডেন্টেশনটি হারাবেন।
ক্রোধ

4
আপনি যখন কোনও এক লাইনে ট্রেস লগইন করতে পারেন এটি কার্যকর
ওয়েবজকি

28
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

নিম্নলিখিত কোড আপনাকে লগ 4 Stringজে বা এমনকি এপিআই ব্যবহার না করে একটি ফর্ম্যাট সহ পুরো স্ট্যাকট্রেস পেতে দেয় 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
হ্যাঁ, তবে আপনি কি ভাবেন না? যে কোনও যুক্তিসঙ্গত আকারের প্রকল্প লগিং ফ্রেমওয়ার্কে কেন বিরক্ত হওয়া আবশ্যক
mzzzzb

এটি প্রথমে ত্রুটি বার্তা দিচ্ছে না। যদিও যোগ করা যেতে পারে
kommradHomer

আপনি সাধারণ কনটেক্সটেশনের পরিবর্তে স্ট্রিংবফার ব্যবহার করতে চাইতে পারেন।
dedda1994

গোপনীয়তার কারণে আপনাকে যখন বার্তাটি লগ করার অনুমতি না দেওয়া হয় তখন এটি কার্যকর হয়।
এম

সচেতন থাকুন যদিও এই সমাধানটি অভ্যন্তরীণ কারণগুলিতে লগ করবে না
এম

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())

ফলাফলটিকে স্ট্রিংয়ে রূপান্তরিত করার সবচেয়ে সহজ উপায়টি আমি স্ট্যাক ট্রেস মুদ্রণের জন্য এটি আমার প্রোগ্রামটিতে ব্যবহার করছি

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

আমার জন্য কাজ করেছেন, কিছুই ছাঁটাই হচ্ছে না! অন্য উত্তরগুলির চেয়ে সহজ, কোনও বাহ্যিক গ্রন্থাগার, দুর্দান্ত উত্তর!
শাং চেং

16

স্ট্যাক ট্রেসটি একটিতে মুদ্রণ করুন PrintStream, তারপরে এটিকে রূপান্তর করুন String:

// ...

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

    System.out.println(str);
}

1
এটি সর্বাধিক সরাসরি উত্তর
ড্যাসকি স্টিটি

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

Kotlin

থ্রোয়েবল ক্লাস বাড়ানো আপনাকে স্ট্রিং প্রপার্টি দেবে 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
ধন্যবাদ এডিয়ারকোকার! এটি আমার সমস্ত ক্লাজের জন্য নিখুঁত কাজ করে। আমি কেবল এটি বেস টেস্টএনজি ক্লাসে যুক্ত করেছি এবং এটি আমার সমস্ত পরীক্ষা থেকে একের পর এক স্ট্যাকট্রেস সংগ্রহ করে!
ক্রিজিস্তফফ ওয়ালকজেউসকি

9

প্রথম সেট মন্তব্যে চতুর স্নিপিং খুব মজাদার ছিল, তবে এটি আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে। আপনার যদি ইতিমধ্যে সঠিক লাইব্রেরি না থাকে তবে 3 লাইন কোড (ডি। ভ্রোবোলস্কির উত্তর হিসাবে) নিখুঁত। ওটিওএইচ, আপনার যদি ইতিমধ্যে অ্যাপাচি ডটকমের গ্রন্থাগার (বেশিরভাগ বড় প্রকল্পগুলি হবে) থাকে তবে অমরের উত্তরটি সংক্ষিপ্ত। ঠিক আছে, গ্রন্থাগারটি পেতে এবং এটি সঠিকভাবে ইনস্টল করতে আপনার দশ মিনিট সময় নিতে পারে (আপনি কী করছেন তা যদি জানেন তবে তার চেয়ে কম)) তবে ঘড়িটি টিকটিক করছে, তাই আপনার অবকাশ দেওয়ার সময় নাও থাকতে পারে। জারেক প্রাইজিডজকির একটি আকর্ষণীয় সতর্কতা ছিল - "যদি আপনার নেস্টেড ব্যতিক্রমগুলির প্রয়োজন না হয়"।

কিন্তু কি যদি আমি না পূর্ণ স্ট্যাক ট্র্যাকও নেস্টেড এবং সব প্রয়োজন? সেক্ষেত্রে, গোপনীয়তা ব্যবহার apache.common এর getFullStackTrace হয় (দেখুন http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html # getFullStackTrace% 28 java.lang.Trowrowable% 29 )

এটা আমার বেকন সংরক্ষণ ধন্যবাদ, আমার, ইঙ্গিতটির জন্য!


9

অ্যাপাচি কমন্স ল্যাং 3.4 ( জাভাডক ) থেকে কোড :

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

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) কারণ এবং তাদের
স্ট্যাকট্র্যাস

পার্থক্যটি বেশ প্রত্যাশিত, যেহেতু printStackTrace()কখনই রূপান্তর করা প্রশ্নের একটি অংশ ছিল না।
আন্দ্রে লেবেডেনকো

3

জাভা 8 স্ট্রিম এপিআই দিয়ে আপনি এরকম কিছু করতে পারেন:

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

এটি স্ট্যাক ট্রেস উপাদানগুলির অ্যারে নেবে, সেগুলিকে স্ট্রিংয়ে রূপান্তর করবে এবং মাল্টলাইন স্ট্রিংয়ে যুক্ত করবে।


2
এই সমাধানটি বার্তা অপসারণ করছে এবং সমস্ত পিতামাতার ট্রেসকে
অগ্রাহ্য করছে

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

পুরানো প্রশ্ন, তবে আমি কেবল একটি বিশেষ কেসটি যুক্ত করতে চাই যেখানে আপনি সমস্ত স্ট্যাকটি মুদ্রণ করতে চান না, এমন কিছু অংশ সরিয়ে দিয়ে আপনি কিছু শ্রেণি বা প্যাকেজ বাদ দিচ্ছেন না removing

পরিবর্তে 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

সতর্কতা: এটি সামান্য বিষয় হতে পারে, তবে ওহ ভাল ...;)

আমি জানি না যে মূল পোস্টারের কারণটি স্ট্যাক ট্রেসকে প্রথম স্থানে স্ট্রিং হিসাবে চাওয়ার জন্য ছিল। যখন স্ট্যাক ট্রেসটি একটি এসএলএফ 4 জে / লগব্যাক লোগোতে শেষ হওয়া উচিত তবে আমি এখানে যা করি তা এখানে ব্যতিক্রম বা ছোঁড়া উচিত নয়:

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
}

আমি এটি পছন্দ করি কারণ এটির জন্য কোনও বাহ্যিক গ্রন্থাগারের প্রয়োজন নেই (আপনার লগিং ব্যাকএন্ড ব্যতীত অন্য কোনও সময় যা অবশ্যই অবশ্য বেশিরভাগ সময় উপস্থিত থাকবে)।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.