স্ট্যাকের ট্রেস না হারিয়ে জাভাতে ব্যতিক্রমগুলি পুনর্বিবেচনা করা হচ্ছে


417

সি # তে, throw;স্ট্যাক ট্রেস সংরক্ষণের সময় আমি একটি ব্যতিক্রম পুনর্হিত করতে স্টেটমেন্টটি ব্যবহার করতে পারি :

try
{
   ...
}
catch (Exception e)
{
   if (e is FooException)
     throw;
}

জাভাতেও এর মতো কিছু আছে ( যা মূল স্ট্যাকের চিহ্নটি হারাবে না )?


4
আপনি কেন মনে করেন যে এটি আসল স্ট্যাকট্রেসটি হারিয়েছে? এটি নতুন করে ছাড়ানোর একমাত্র উপায় যখন আপনি নতুন সামান্য অন্য ধারণাটি নিক্ষেপ করেন এবং কনস্ট্রাক্টর বা ইনিসকজ () এ মূল কারণটি নির্ধারণ করতে ভুলে যান।
আকনারোকদ

4
আমি বিশ্বাস করি কোডটি নেট। এ কেমন আচরণ করে তবে আমি আর ইতিবাচক থাকি না। এটি কোথাও সন্ধান করা বা একটি ছোট পরীক্ষা চালানো সার্থক হতে পারে।
রিপার 234

11
Throwableএগুলি নিক্ষেপ করে সংশোধন করবেন না। স্ট্যাক ট্রেস আপডেট করতে আপনাকে কল করতে হবে fillInStackTrace()। সুবিধামত এই পদ্ধতিটি একটি এর কনস্ট্রাক্টরে কল হয় Throwable
রবার্ট

50
সি # তে, হ্যাঁ, throw e;স্ট্যাকট্রেস হারাবে। তবে জাভাতে নয়।
টিম গুডম্যান

উত্তর:


560
catch (WhateverException e) {
    throw e;
}

আপনি যে ব্যতিক্রমটি ধরা পড়েছেন তা সহজেই পুনর্বিবেচনা করবে (স্পষ্টতই পার্শ্ববর্তী পদ্ধতিটি তার স্বাক্ষর ইত্যাদির মাধ্যমে এটির অনুমতি দিতে হবে)। ব্যতিক্রমটি মূল স্ট্যাক ট্রেস বজায় রাখবে।


4
হাই, ইন্টারপ্রেডএক্সেপশন ই আমি নিক্ষেপ ই লাইন যুক্ত করার পরে একটি অবিচ্ছিন্ন ব্যতিক্রম বার্তা দেয়। আমি যদি এর সাথে বিস্তৃত ব্যতিক্রম e এর সাথে প্রতিস্থাপন করি তবে তা নয়। এটি কীভাবে সঠিকভাবে করা উচিত?
জেমস পি।

1
@ জেমস, আমি কেবল পর্যবেক্ষণ করেছি যে ফাংশন ঘোষণায় "থ্রো এক্সএক্সএক্সএক্সসেপশন" যোগ করলে বার্তাটি চলে যায়।
শিওমিং

2
জাভাতে এই জাতীয় পুনর্বিবেচনার জন্য 7 সংকলক আরও স্বচ্ছন্দ। এখন এটি পদ্ধতিতে বিশিষ্ট "ছোঁড়া" ব্যতিক্রমের সাথে দুর্দান্ত কাজ করে।
ওয়াল্ডেমার ওসিসিস্কি

193
@ জেমস যদি আপনি catch(Exception e) { throw e; }তা নিয়ন্ত্রণহীন হয়ে থাকেন । আপনি যদি catch(InterruptedException ie) { throw ie; }এটি পরিচালনা করা হবে। থাম্বের নিয়ম হিসাবে, করবেন না catch(Exception e)- এটি পোকমন নয়, এবং আমরা তাদের সব ধরতে চাই না!
কর্সিকা

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

82

আমি পছন্দ করবো:

try
{
    ...
}
catch (FooException fe){
   throw fe;
}
catch (Exception e)
{
    // Note: don't catch all exceptions like this unless you know what you
    // are doing.
    ...
}

6
জেনারিকের তুলনায় নির্দিষ্ট ব্যতিক্রম এবং উদাহরণ হিসাবে পরীক্ষা করার জন্য অবশ্যই জাভাতে অবশ্যই যথাযথ checking +1
amischiefr

8
-1 কারণ আপনি কখনই জানেন না আপনি কখনই সরল "ব্যতিক্রম" ধরেন না you're
স্ট্রোবস্কোপ

19
@ স্ট্রোবস্কোপ: সত্য, তবে উত্তর দেওয়ার জন্য প্রশ্নের মতো একই (অনুরূপ) কোডটি ব্যবহার করা ভাল!
ব্যবহারকারী 85421

14
কখনও কখনও সমস্ত ব্যতিক্রম ধরা ঠিক আছে। যেমন আপনি যখন কোনও পরীক্ষার কেস লিখছেন। বা লগিং উদ্দেশ্যে। বা মূল যেখানে ধরা না মানে ক্রাশ হওয়া।
জন হেন্কেল

1
@ জনহেন্কেল এবং অন্যান্য: বৈধ পয়েন্ট যুক্ত ed আমি প্রশ্নটি আপডেট করে এটি পরিষ্কার করেছিলাম যে বেশিরভাগ ক্ষেত্রে (তবে সমস্ত নয়) ক্ষেত্রে ধরা Exceptionসাধারণত সঠিকভাবে করা ঠিক নয়।
প্রতি লন্ডবার্গ

74

আপনি অপরটিকে অন্য একটিতেও মোড়তে পারেন এবং ব্যর্থতার কারণ হিসাবে প্যারামিটার হিসাবে ব্যতিক্রম হিসাবে পাস করে মূল স্ট্যাকের ট্রেস রাখতে পারেন:

try
{
   ...
}
catch (Exception e)
{
     throw new YourOwnException(e);
}

8
আমি পাশাপাশি ব্যবহার করে একটি বার্তা যুক্ত করার পরামর্শ দেবthrow new YourOwnException("Error while trying to ....", e);
জুলিয়েন

এটি আমি যা খুঁজছিলাম, বিশেষত প্রথম মন্তব্যটির সংস্করণ যেখানে আপনি নিজের বার্তাটি পাস করতে পারেন
সিএসবা

এটি ত্রুটি বার্তাটি সঠিকভাবে দেখায় তবে স্ট্যাক ট্রেস ত্রুটিরেখাকে 'নিক্ষেপ নতুন ....... (ই)' এর মতো লাইন হিসাবে দেখায় যা ব্যতিক্রম ঘটায় line
অ্যাশবার্ন আরকে

22

জাভাতে প্রায় একই রকম:

try
{
   ...
}
catch (Exception e)
{
   if (e instanceof FooException)
     throw e;
}

5
না, যতক্ষণ না আপনি কোনও নতুন এক্সেপশন-অবজেক্ট ইনস্ট্যান্ট করবেন না স্ট্যাকট্রেস একই থাকে।
মুনেন্থে

28
আমি FooException এর জন্য একটি নির্দিষ্ট ক্যাচ যুক্ত করব
ডিএফএ

3
এই নির্দিষ্ট ক্ষেত্রে আমি সম্মত, তবে একটি নির্দিষ্ট ক্যাচ যুক্ত করা সঠিক পছন্দ নাও হতে পারে - কল্পনা করুন যে আপনার সমস্ত ব্যতিক্রমের জন্য কিছু সাধারণ কোড রয়েছে এবং পরে, কোনও বিশেষ ব্যতিক্রমের জন্য, এটি পুনরায় সেট করুন।
alves

1
@ মারকাসলৌসবার্গ কিন্তু শেষ পর্যন্ত ব্যতিক্রমগুলি ধরেন না।
রবার্ট

হ্যাঁ, তবে এটি প্রশ্ন ছিল না।
মার্কাস লসবার্গ

14

জাভা, আপনি শুধু ব্যতিক্রম আপনি ধরা নিক্ষেপ তাই throw eবরং তুলনায় throw। জাভা স্ট্যাক ট্রেস বজায় রাখে।


6

এটার মতো কিছু

try 
{
  ...
}
catch (FooException e) 
{
  throw e;
}
catch (Exception e)
{
  ...
}

5
public int read(byte[] a) throws IOException {
    try {
        return in.read(a);
    } catch (final Throwable t) {
        /* can do something here, like  in=null;  */
        throw t;
    }
}

এটি একটি কংক্রিট উদাহরণ যেখানে পদ্ধতিটি নিক্ষেপ করে IOExceptionfinalউপায়গুলি কেবল tচেষ্টা ব্লক থেকে ফেলে দেওয়া ব্যতিক্রম ধরে রাখতে পারে। অতিরিক্ত পড়ার উপাদানগুলি এখানে এবং এখানে পাওয়া যাবে


1
এটি চূড়ান্ত হতে হবে না। দেখুন docs.oracle.com/javase/7/docs/technotes/guides/language/... এবং stackoverflow.com/a/6889301/131160
jcsahnwaldt GoFundMonica বলছেন

3

যদি আপনি ক্যাচড এক্সেসশনটিকে অন্য কোনও ব্যতিক্রম (আরও তথ্য সরবরাহের জন্য) আবদ্ধ করেন বা যদি আপনি কেবল ক্যাচড এক্সেসিকে পুনর্বিবেচনা করেন তবে স্ট্যাক ট্রেসকে পার্সওয়ার্ড করা হয়।

try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }


2

আমার ঠিক একইরকম পরিস্থিতি ছিল যেখানে আমার কোডটি সম্ভাব্যভাবে বিভিন্ন ব্যতিক্রমগুলি ছুঁড়ে মারে যা আমি কেবল পুনরায় প্রকাশ করতে চেয়েছিলাম। উপরে বর্ণিত সমাধানটি আমার পক্ষে কাজ করে না, কারণ throw e;গ্রহপী আমাকে বলেছিল যা একটি নিরস্ত্র ব্যতিক্রমের দিকে পরিচালিত করে, তাই আমি কেবল এটি করেছি:

try
{
...
} catch (NoSuchMethodException | SecurityException | IllegalAccessException e) {                    
    throw new RuntimeException(e.getClass().getName() + ": " + e.getMessage() + "\n" + e.getStackTrace().toString());
}

আমার জন্য কাজ করেছেন .... :)

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