ব্যতিক্রম.প্রিন্টস্ট্যাকট্রেসকে () খারাপ অভ্যাস হিসাবে বিবেচনা করা হয় কেন?


126

একটা হল অনেক এর উপাদান আউট সেখানে যা বলে যে মুদ্রণ এক ব্যতিক্রমের স্ট্যাক ট্রেস খারাপ অভ্যাস।

উদাহরণস্বরূপ চেকস্টাইলে রেজিপ্যাক্সসিংলাইন চেক থেকে:

প্রাক্তন প্রিন্ট স্ট্যাকট্রেস () কল করার মতো সাধারণ খারাপ অনুশীলনগুলি খুঁজে পেতে এই চেকটি ব্যবহার করা যেতে পারে [...]

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

  1. স্ট্যাক ট্রেসটি শেষ ব্যবহারকারীদের জন্য কখনই দৃশ্যমান হওয়া উচিত নয় (ব্যবহারকারীর অভিজ্ঞতা এবং সুরক্ষা উদ্দেশ্যে)

  2. স্ট্যাক ট্রেস তৈরি করা তুলনামূলকভাবে ব্যয়বহুল প্রক্রিয়া (যদিও বেশিরভাগ 'ব্যতিক্রমী' পরিস্থিতিতে সমস্যা হওয়ার সম্ভাবনা কম))

  3. অনেক লগিং ফ্রেমওয়ার্কগুলি আপনার জন্য স্ট্যাক ট্রেস প্রিন্ট করবে (আমাদের এটি হয় এবং না, আমরা সহজেই এটি পরিবর্তন করতে পারি না)

  4. স্ট্যাক ট্রেস মুদ্রণ ত্রুটি হ্যান্ডলিং গঠিত হয় না। এটি অন্যান্য তথ্য লগিং এবং ব্যতিক্রম হ্যান্ডলিংয়ের সাথে একত্রিত হওয়া উচিত।

আপনার কোডে স্ট্যাক ট্রেস মুদ্রণ এড়িয়ে যাওয়ার অন্যান্য কী কারণ রয়েছে?


12
যেহেতু নিয়মিত সমস্যা সমাধান করতে হয় সেহেতু, কোনও কিছু ভুল হয়ে গেলে আমি কখনই স্ট্যাকট্রেস প্রিন্ট করা বাদ দেব না । হ্যাঁ, এটি ব্যবহারকারীর কাছে দেখাবেন না, তবে হ্যাঁ, এটিকে একটি ত্রুটিযুক্ত লগ এ ফেলে দিন।
পল গ্রিম

4
আপনার কি অন্য কারণের দরকার আছে? আমি মনে করি আপনি নিজের প্রশ্নের উত্তর মোটামুটিভাবে দিয়েছেন। তবে স্ট্যাকট্রেস ব্যতিক্রমী ব্যতিক্রমগুলিতে মুদ্রিত হওয়া উচিত। :)
নীল

উত্তর:


125

Throwable.printStackTrace()স্ট্যাক ট্রেসটি System.errপ্রিন্ট স্ট্রিমে লিখেছেন । System.errপ্রবাহ এবং অন্তর্নিহিত মান "ত্রুটি" আউটপুট জেভিএম প্রক্রিয়ার প্রবাহ দ্বারা আপনাকে পুনঃনির্দেশিত করা যেতে পারে

  • অনুরোধ করা System.setErr()যা দ্বারা নির্দেশিত গন্তব্য পরিবর্তন করে System.err
  • বা প্রক্রিয়া পুনর্নির্দেশ দ্বারা ত্রুটি আউটপুট প্রবাহ। ত্রুটি আউটপুট স্ট্রিম কোনও ফাইল / ডিভাইসে পুনঃনির্দেশিত হতে পারে
    • যার বিষয়বস্তু কর্মীদের দ্বারা উপেক্ষা করা হতে পারে,
    • ফাইল / ডিভাইস লগ রোটেশনে সক্ষম নাও হতে পারে, অনুমান করে যে ফাইল / ডিভাইসের বিদ্যমান সামগ্রী সংরক্ষণাগার স্থাপনের আগে খোলা ফাইল / ডিভাইস হ্যান্ডেলটি বন্ধ করার জন্য একটি প্রক্রিয়া পুনরায় চালু করা প্রয়োজন।
    • বা ফাইল / ডিভাইস আসলে এতে লিখিত সমস্ত ডেটা বাতিল করে দেয় /dev/null

উপরের দিক থেকে নির্দেশ করে, কেবলমাত্র Throwable.printStackTrace()বৈধ (ভাল / দুর্দান্ত নয়) ব্যতিক্রম হ্যান্ডলিং আচরণটি গঠন করে

  • আপনি যদি System.errঅ্যাপ্লিকেশনটির জীবদ্দশায় পুরো সময়কালে পুনরায় নিয়োগ না পান ,
  • এবং অ্যাপ্লিকেশন চলাকালীন আপনার যদি লগ রোটেশন প্রয়োজন না হয়,
  • এবং যদি অ্যাপ্লিকেশনটির স্বীকৃত / ডিজাইন করা লগিং অনুশীলনটি লিখতে হয় System.err(এবং জেভিএমের স্ট্যান্ডার্ড ত্রুটি আউটপুট স্ট্রিম)।

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

শেষ অবধি, আপনার মনে রাখা উচিত যে Throwable.printStackTrace()লিখিত অন্য সামগ্রীর সাথে আউটপুট অবশ্যই স্পষ্টভাবে ইন্টারলিভড হয়ে যাবে System.err(এবং সম্ভবত System.outউভয়টি একই ফাইল / ডিভাইসে পুনঃনির্দেশিত হলেও )। এটি একটি বিরক্তি (একক থ্রেডেড অ্যাপ্লিকেশনগুলির জন্য) যেটির সাথে অবশ্যই মোকাবেলা করা উচিত, কারণ ব্যতিক্রম সম্পর্কিত তথ্য এই জাতীয় ইভেন্টে সহজেই পার্সেবল হয় না। সবচেয়ে খারাপ, সম্ভবত এটি সম্ভবত যে কোনও মাল্টি-থ্রেডযুক্ত অ্যাপ্লিকেশনটি খুব বিভ্রান্তিকর লগ তৈরি করবে কারণ Throwable.printStackTrace() থ্রেড-নিরাপদ নয়

একসাথে System.errএকাধিক থ্রেড যখন অনুরোধ করা হয় তখন স্ট্যাক ট্রেসের লিখনকে সিঙ্ক্রোনাইজ করার কোনও সমন্বয় ব্যবস্থা নেই Throwable.printStackTrace()। এটিকে সমাধান করার জন্য আপনার কোডটি সম্পর্কিত মনিটরের সাথে সিঙ্ক্রোনাইজ করা প্রয়োজন System.err(এবং এছাড়াও System.out, গন্তব্য ফাইল / ডিভাইস একই থাকলে) এবং লগ ফাইলের স্যানিটি দেওয়ার জন্য এটির চেয়ে ভারী মূল্য। উদাহরণস্বরূপ, ক্লাস ConsoleHandlerএবং StreamHandlerক্লাসগুলি সরবরাহ করা লগিং সুবিধাটিতে কনসোলটিতে লগ রেকর্ড সংযোজনের জন্য দায়ী java.util.logging; লগ রেকর্ডগুলি প্রকাশের আসল ক্রিয়াকলাপটি সিঙ্ক্রোনাইজ করা হয়েছে - প্রতিটি থ্রেড যা লগ রেকর্ড প্রকাশের চেষ্টা করে তা অবশ্যই মনিটরের সাথে সম্পর্কিত লকটি অর্জন করতে হবেStreamHandlerদৃষ্টান্ত. যদি আপনি System.out/ অ-আন্তঃবিবাহিত লগ রেকর্ডগুলি ব্যবহার করে / রাখার একই গ্যারান্টি পেতে চান তবে System.errআপনাকে অবশ্যই তা নিশ্চিত করতে হবে - বার্তাগুলি এই স্ট্রিমগুলিতে ক্রমিক আকারে প্রকাশিত হয়।

উপরের সমস্তটি এবং অত্যন্ত সীমাবদ্ধ পরিস্থিতিগুলি যা Throwable.printStackTrace()বাস্তবে কার্যকর তা বিবেচনা করে দেখা যায়, প্রায়শই দেখা যায় যে এটি আহ্বান করা একটি খারাপ অভ্যাস।


পূর্ববর্তী অনুচ্ছেদেগুলির মধ্যে একটিতে যুক্তি প্রসারিত Throwable.printStackTraceকরা, কনসোলকে লেখার লগারের সাথে একযোগে ব্যবহার করাও বাঞ্ছনীয় পছন্দ । এটি আংশিকভাবে, লगर একটি ভিন্ন মনিটরে সিঙ্ক্রোনাইজ হওয়ার কারণে, যখন আপনার অ্যাপ্লিকেশনটি (সম্ভবত, যদি আপনি ইন্টারলিভড লগ রেকর্ডগুলি না চান) আলাদা মনিটরে সিঙ্ক্রোনাইজ করে। আপনি যখন আবেদনে একই গন্তব্যটিতে লেখেন এমন দুটি আলাদা লগার ব্যবহার করেন তখন যুক্তিটিও ভাল থাকে।


দুর্দান্ত উত্তর, ধন্যবাদ। যাইহোক, যদিও আমি সম্মত হই যে বেশিরভাগ সময় এর শব্দ বা প্রয়োজন হয় না, এমন সময়গুলি আসে যখন একেবারে সমালোচনা হয়।
ক্রিস নাইট

1
@Chris হ্যাঁ, বার যখন আপনি কিন্তু ব্যবহার করতে পারবেন না হয় System.out.printlnএবং Throwable.printStackTraceএবং অবশ্যই, ডেভেলপার রায় প্রয়োজন। থ্রেড-সুরক্ষা সম্পর্কে যে অংশটি মিস হয়েছিল তা আমি খানিকটা চিন্তিত ছিলাম। আপনি যদি বেশিরভাগ লগার বাস্তবায়নগুলি লক্ষ্য করেন তবে আপনি লক্ষ্য করবেন যে তারা লগ রেকর্ডগুলি যেখানে লেখা রয়েছে (এমনকি কনসোল পর্যন্তও) সেই অংশটি সিঙ্ক্রোনাইজ করেছে, যদিও তারা মনিটর অর্জন করে System.errবা না করে System.out
ভিনিতে রেনল্ডস

2
আমি কি ভুল করে খেয়াল করব যে এই কারণগুলির কোনওটিই প্রিন্টস্ট্র্যাকট্রেস ওভাররাইডগুলিতে প্রযোজ্য না যা একটি প্যারামিটার হিসাবে একটি প্রিন্টস্ট্রিম বা মুদ্রণ লেখক বস্তু গ্রহণ করে?
ESRogs

1
@ গীক, দ্বিতীয়টি হ'ল প্রক্রিয়া ফাইলের বর্ণনাকারী 2 মান সহ পূর্ববর্তীটি কেবল একটি বিমূর্ততা।
ভিনিতে রেনল্ডস

1
JDK সোর্স কোড প্রিন্টস্ট্যাকট্রেসে (), এটি সিস্টেম.আর প্রিন্টস্ট্রিম লক করার জন্য সিঙ্ক্রোনাইজড ব্যবহার করে, সুতরাং এটি থ্রেড-নিরাপদ পদ্ধতি হওয়া উচিত।
EyouGo

33

আপনি এখানে একাধিক সমস্যা স্পর্শ করছেন:

1) একটি স্ট্যাক ট্রেস কখনই শেষ ব্যবহারকারীদের জন্য দৃশ্যমান হওয়া উচিত নয় (ব্যবহারকারীর অভিজ্ঞতা এবং সুরক্ষা উদ্দেশ্যে)

হ্যাঁ, শেষ ব্যবহারকারীদের সমস্যাগুলি নির্ণয়ের জন্য এটি অ্যাক্সেসযোগ্য হওয়া উচিত, তবে শেষ ব্যবহারকারীর দুটি কারণেই এগুলি দেখতে পাওয়া উচিত নয়:

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

২) স্ট্যাক ট্রেস তৈরি করা তুলনামূলকভাবে ব্যয়বহুল প্রক্রিয়া (যদিও বেশিরভাগ 'ব্যতিক্রমী পরিস্থিতিতে সমস্যা হওয়ার সম্ভাবনা কম))

স্ট্যাক ট্রেস তৈরি করা যখন ব্যতিক্রম তৈরি / নিক্ষেপ করা হচ্ছে তখন ঘটে (সেই কারণেই ব্যতিক্রম ছুঁড়ে দেওয়া একটি দামের সাথে আসে), মুদ্রণটি এত ব্যয়বহুল নয়। আসলে আপনি ওভাররাইড করতে পারেনThrowable#fillInStackTrace() আপনার কাস্টম ব্যতিক্রমকে কার্যকরভাবে একটি সাধারণ গোটো স্টেটমেন্ট হিসাবে প্রায় ব্যয়বহুল একটি ব্যতিক্রম নিক্ষেপ করে কার্যকরভাবে ।

3) অনেক লগিং ফ্রেমওয়ার্কগুলি আপনার জন্য স্ট্যাক ট্রেস প্রিন্ট করবে (আমাদের এটি এবং না, আমরা সহজেই এটি পরিবর্তন করতে পারি না)

খুব ভাল পয়েন্ট। এখানে মূল বিষয়টি হ'ল: যদি ফ্রেমওয়ার্কটি আপনার ব্যতিক্রম লগ করে, কিছু না করে (তবে এটি নিশ্চিত করুন!) আপনি নিজে ব্যতিক্রমটি লগ করতে চান, লগব্যাকের মতো লগিং ফ্রেমওয়ার্ক বা ব্যবহার করুন Log4J তাদের কাঁচা কনসোলে না করা কারণ এটি নিয়ন্ত্রণ করা খুব কঠিন।

লগিং ফ্রেমওয়ার্কের সাহায্যে আপনি স্ট্যাকের ট্রেসগুলিকে সহজেই ফাইল, কনসোল বা অন্য কোনও নির্দিষ্ট ইমেল ঠিকানায় প্রেরণ করতে পারবেন। হার্ডকোডযুক্ত printStackTrace()আপনাকে সাথে থাকতে হবে sysout

4) স্ট্যাক ট্রেস মুদ্রণ ত্রুটি পরিচালনা পরিচালনা করে না। এটি অন্যান্য তথ্য লগিং এবং ব্যতিক্রম হ্যান্ডলিংয়ের সাথে একত্রিত হওয়া উচিত।

আবার: SQLExceptionসঠিকভাবে লগ (সম্পূর্ণ স্ট্যাক ট্রেস সহ, লগিং ফ্রেমওয়ার্ক ব্যবহার করে) এবং দুর্দান্ত দেখান: " দুঃখিত, আমরা বর্তমানে আপনার অনুরোধটি প্রক্রিয়া করতে পারছি না " বার্তাটি। আপনি কি মনে করেন যে ব্যবহারকারীরা কারণগুলিতে আগ্রহী? আপনি স্ট্যাকওভারফ্লো ত্রুটি স্ক্রিনটি দেখেছেন? এটি খুব হাস্যকর, তবে কোনও বিবরণ প্রকাশ করে না । তবে এটি ব্যবহারকারীকে নিশ্চিত করে যে সমস্যাটি তদন্ত করা হবে।

তবে তিনি তত্ক্ষণাত আপনাকে কল করবেন এবং আপনার সমস্যাটি সনাক্ত করতে সক্ষম হওয়া দরকার। সুতরাং আপনার উভয়ের প্রয়োজন: যথাযথ ব্যতিক্রম লগিং এবং ব্যবহারকারী-বান্ধব বার্তা।


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


আপনার উত্তরটি আমি পেয়েছি।
ব্লাসানকা

"বেশিরভাগ 'ব্যতিক্রমী পরিস্থিতি"। সুন্দর।
awwsmm

19

প্রথম জিনিস প্রিন্ট স্ট্যাকট্রেস () হিসাবে ব্যয়বহুল নয়, কারণ ব্যতিক্রম নিজেই তৈরি হয়ে গেলে স্ট্যাক ট্রেস পূরণ করা হয়।

ধারণাটি হ'ল লগারের কাঠামোর মধ্য দিয়ে লগগুলিতে যাওয়া যে কোনও কিছু পাস করা, যাতে লগিং নিয়ন্ত্রণ করা যায়। তাই প্রিন্টস্ট্যাকট্রেস ব্যবহার না করে এর মতো কিছু ব্যবহার করুনLogger.log(msg, exception);


11

ব্যতিক্রম স্ট্যাক ট্রেস নিজেই মুদ্রণ খারাপ অভ্যাস গঠন করে না, তবে শুধুমাত্র stace ট্রেস মুদ্রণ একটি ব্যতিক্রম ঘটে যখন সম্ভবত এখানে ইস্যু - প্রায়ই বার, শুধু একটি স্ট্যাক ট্রেস মুদ্রণ যথেষ্ট নয়।

এছাড়াও, যদি সন্দেহ হয় যে কোনও catchব্লকে যে সমস্ত কাজ করা হচ্ছে একটি হ'ল সঠিক ব্যতিক্রম হ্যান্ডলিং করা হচ্ছে না তা নিয়ে সন্দেহ করার প্রবণতা রয়েছে e.printStackTrace। অনুপযুক্ত হ্যান্ডলিংয়ের অর্থ হতে পারে সর্বোপরি কোনও সমস্যা উপেক্ষা করা হচ্ছে এবং সবচেয়ে খারাপভাবে এমন একটি প্রোগ্রাম যা অপরিজ্ঞাত বা অপ্রত্যাশিত অবস্থায় চালিয়ে যেতে থাকে।

উদাহরণ

আসুন নিম্নলিখিত উদাহরণটি বিবেচনা করুন:

try {
  initializeState();

} catch (TheSkyIsFallingEndOfTheWorldException e) {
  e.printStackTrace();
}

continueProcessingAssumingThatTheStateIsCorrect();

এখানে, আমরা কিছু প্রক্রিয়াজাতকরণ চালিয়ে যাওয়ার আগে কিছু প্রাথমিককরণ প্রক্রিয়াজাতকরণ করতে চাই যার প্রয়োজন যে প্রাথমিককরণটি হয়েছিল।

উপরের কোডে, ব্যতিক্রমটি ধরা এবং যথাযথভাবে পরিচালনা করা উচিত ছিল যাতে প্রোগ্রামটি এগিয়ে যেতে আটকা যায় continueProcessingAssumingThatTheStateIsCorrect পদ্ধতিতে যেতে পারি তাতে সমস্যা হতে পারে।

অনেক ক্ষেত্রে, e.printStackTrace()এটি একটি ইঙ্গিত যে কিছু ব্যতিক্রম গিলে ফেলা হচ্ছে এবং প্রক্রিয়াজাতকরণটিকে এগিয়ে যাওয়ার অনুমতি দেওয়া হয়েছে যেন প্রতিটি সমস্যাই ঘটে না।

কেন এটি একটি সমস্যা হয়ে দাঁড়িয়েছে?

অ্যালবামের মতো আইডিই কীভাবে কোডটি স্বয়ংক্রিয়ভাবে উত্পন্ন করবে যে e.printStackTraceব্যতিক্রম পরিচালনার জন্য একটি সম্পাদন করবে: সম্ভবত সম্ভবত সবচেয়ে খারাপ কারণ হ'ল দুর্বল ব্যতিক্রম হ্যান্ডলিং প্রচলিত হয়ে উঠেছে one

try {
  Thread.sleep(1000);
} catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

(উপরে প্রকৃত হয় try-catchস্বয়ংক্রিয়ভাবে তৈরি অন্ধকার দ্বারা একটি হ্যান্ডেল করতে InterruptedExceptionদ্বারা নিক্ষিপ্ত Thread.sleep।)

বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য, কেবল স্ট্যাক ট্রেসকে স্ট্যান্ডার্ড ত্রুটিতে মুদ্রণ করা সম্ভবত যথেষ্ট হবে না। অযৌক্তিক ব্যতিক্রম হ্যান্ডলিং অনেক ক্ষেত্রেই এমন একটি অ্যাপ্লিকেশন চালিয়ে যেতে পারে যা এমন অবস্থায় চালিত হয় যা অপ্রত্যাশিত এবং অপ্রত্যাশিত এবং অপরিজ্ঞাত আচরণের দিকে পরিচালিত করে।


1
এই. বেশিরভাগ ক্ষেত্রে কেবল ব্যতিক্রমকে মোটেও ধরা না দেওয়া , কমপক্ষে পদ্ধতি পর্যায়ে ধরা পড়ার চেয়ে স্ট্যাক ট্রেসের প্রিন্ট করা এবং চালিয়ে যাওয়া যেমন কোনও সমস্যা না ঘটে তার চেয়ে ভাল।
eis

10

আমি মনে করি আপনার কারণগুলির তালিকাটি বেশ বিস্তৃত।

একটি বিশেষ করে খারাপ উদাহরণ যা আমি একাধিকবার সম্মুখীন হয়েছি এরকম হয়:

    try {
      // do stuff
    } catch (Exception e) {
        e.printStackTrace(); // and swallow the exception
    }

উপরের কোড দিয়ে সমস্যা হল হ্যান্ডলিং গঠিত হয় সম্পূর্ণরূপে এর printStackTraceকল: ব্যতিক্রম সত্যিই সঠিকভাবে পরিচালনা করা হয় না না এটা অব্যাহতি অনুমোদিত হয়।

অন্যদিকে, একটি নিয়ম হিসাবে আমি সর্বদা স্ট্যাক ট্রেস লগইন করি যখনই আমার কোডটিতে অপ্রত্যাশিত ব্যতিক্রম ঘটে। বছরের পর বছর ধরে এই নীতিটি আমাকে অনেকগুলি ডিবাগ করার সময় বাঁচিয়েছে।

অবশেষে, একটি হালকা নোটে, God'sশ্বরের পারফেক্ট ব্যতিক্রম


"ব্যতিক্রম পালানোর অনুমতি নেই" - আপনি কি ব্যতিক্রমটি স্ট্যাক পর্যন্ত প্রচার করেছেন বলে বোঝাতে চেয়েছিলেন? প্রিন্টস্ট্যাকট্রেস () থেকে লগিং কীভাবে আলাদা?
মাস্টারজয়ে

5

printStackTrace()একটি কনসোল মুদ্রণ। প্রোডাকশন সেটিংসে, কেউ কখনও সেদিকে নজর দিচ্ছে না। সুরজ সঠিক, এই তথ্য কোনও লগারের কাছে পৌঁছে দেওয়া উচিত।


বৈধ পয়েন্ট, যদিও আমরা আমাদের উত্পাদন কনসোল আউটপুট সাবধানে লক্ষ্য করি।
ক্রিস নাইট

আপনি কী সাবধানতার সাথে লক্ষ্য রেখে বোঝাতে পারেন? কিভাবে এবং কে? কোন ফ্রিকোয়েন্সি এ?
ওহ চিন বুন

সাবধানতার সাথে পর্যবেক্ষণ দ্বারা, আমি যখন প্রয়োজন ছিল উচিত। এটি একটি ঘূর্ণায়মান লগ ফাইল যা আমাদের অ্যাপ্লিকেশনটির সাথে কিছু ভুল হয়ে থাকলে কলের কয়েকটি বন্দরগুলির মধ্যে একটি।
ক্রিস নাইট

3

সার্ভার অ্যাপ্লিকেশনগুলিতে স্ট্যাকট্রেস আপনার স্টাডাউট / স্টডার ফাইলটি ফুটিয়ে তোলে। এটি আরও বড় এবং বৃহত্তর হয়ে উঠতে পারে এবং অকেজো ডেটাতে ভরা থাকে কারণ সাধারণত আপনার কোনও প্রসঙ্গ থাকে না এবং টাইমস্ট্যাম্প ইত্যাদি থাকে।

যেমন ক্যাটালিনা.আউট কনটেইনার হিসাবে টমক্যাট ব্যবহার করার সময়


ভাল যুক্তি. মুদ্রণ স্ট্যাকট্রেসের অপব্যবহার () আমাদের লগিং ফাইলগুলিকে ফুটিয়ে তুলতে পারে বা খুব কম সময়েই এটি অকেজো তথ্যের পুনরায় পূরণ করতে পারে
ক্রিস নাইট

@ ক্রিসকাইট - আপনি দয়া করে কোনও নিবন্ধের পরামর্শ দিতে পারেন যাতে লগিং ফাইলগুলি কীভাবে অকেজো তথ্যের সাথে ফুটিয়ে উঠতে পারে? ধন্যবাদ।
মাস্টারজয়ে

3

এটি খারাপ অভ্যাস নয় কারণ প্রিন্টস্ট্যাকট্রেস () সম্পর্কে কিছু 'ভুল' তবে এটি 'কোড গন্ধ' বলে because বেশিরভাগ সময় প্রিন্টস্ট্যাকট্রেস () কল থাকে কারণ কেউ ব্যতিক্রমটি সঠিকভাবে পরিচালনা করতে ব্যর্থ হয়। একবার আপনি যদি সঠিকভাবে ব্যতিক্রমটি মোকাবেলা করেন তবে আপনি সাধারণত স্ট্যাকট্রেস সম্পর্কে আর চিন্তা করেন না।

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


0

কিছু ছেলেরা এখানে ইতিমধ্যে উল্লিখিত হিসাবে সমস্যাটি কেবলমাত্র আপনি যদি ব্লকটিতে কল e.printStackTrace()করেন তবে ব্যতিক্রম গিলে ফেলতে হবে catch। এটি থ্রেড কার্যকর করা বন্ধ করবে না এবং চেষ্টা করুন সাধারণ অবস্থার মতো ব্লকের পরেও চালিয়ে যাবে।

এর পরিবর্তে আপনাকে হয় ব্যতিক্রম থেকে পুনরুদ্ধার করার চেষ্টা করা উচিত (যদি এটি পুনরুদ্ধারযোগ্য হয়), অথবা RuntimeExceptionনীরব ক্রাশগুলি এড়াতে কলারের কাছে ব্যতিক্রম নিক্ষেপ করা বা বুদবুদ করা (উদাহরণস্বরূপ, অনুপযুক্ত লগার কনফিগারেশনের কারণে)।


0

জঙ্গী আউটপুট স্ট্রিম সমস্যাটি এড়াতে @ ভিনিট রেনল্ডস দ্বারা উল্লেখ

আপনি এটিকে প্রিন্ট করতে পারেন: e.printStackTrace(System.out);

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