অবিচ্ছিন্ন চকনোরিস এক্সসেপশন


596

জাভাতে কোডের একটি স্নিপেট তৈরি করা সম্ভব যা একটি অনুমানমূলক java.lang.ChuckNorrisExceptionঅপ্রকাশ্য করতে পারে ?

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



2
@jschoen প্রদত্ত লিঙ্কটি থেকে পরামর্শটি ব্যবহার করে (বাইট কোড ভেরিফায়ারটি অক্ষম করুন) আপনি এমন কিছু নিক্ষেপ করতে পারেন যা থ্রোয়েবলকে প্রসারিত করে না! নীচে আমার উত্তর বর্ণিত।
jtahlorn

4
আইওবের উত্তরের এই অংশটি @ জসকোইনকে বেশ ভালভাবে যুক্ত করা প্রশ্নের উত্তরটিকে বোঝায়: "অর্থাৎ, আপনার প্রশ্নের ব্যাখ্যা 'যদি কোনও জেভিএম স্পেসিফিকেশন থেকে বিচ্যুত হয়, তবে এটি কি প্রিমিটিকস নিক্ষেপের মতো অদ্ভুত জিনিস করতে পারে এবং উত্তরটি অবশ্যই অবশ্যই, হ্যাঁ."
ড্যান ইজ ফিজলিং ফায়ারলাইট

2
@ ম্যাক্স - আপনি কি এর ব্যবহারিক ব্যবহারের বিস্তারিত ব্যাখ্যা করতে পারেন?
বিনীত ভাটিয়া

3
কিভাবে নিজেকে বাদ দিয়ে একটি ব্যতিক্রম সম্পর্কে finalize()?
মিথ্যা রায়ান

উত্তর:


314

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

হালনাগাদ:

এটি কাজ করে না। এটি একটি যাচাইকারী ত্রুটি উত্পন্ন করে:

Exception in thread "main" java.lang.VerifyError: (class: TestThrow, method: ma\
in signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
Could not find the main class: TestThrow.  Program will exit.

আপডেট 2:

আসলে, আপনি বাইট কোড ভেরিফায়ারটি অক্ষম করলে আপনি এটি কাজ করতে পারেন! ( -Xverify:none)

আপডেট 3:

বাড়ি থেকে নিম্নলিখিতদের জন্য, এখানে সম্পূর্ণ স্ক্রিপ্ট:

নিম্নলিখিত ক্লাস তৈরি করুন:

public class ChuckNorrisException
    extends RuntimeException // <- Comment out this line on second compilation
{
    public ChuckNorrisException() { }
}

public class TestVillain {
    public static void main(String[] args) {
        try {
            throw new ChuckNorrisException();
        }
        catch(Throwable t) {
            System.out.println("Gotcha!");
        }
        finally {
            System.out.println("The end.");
        }
    }
}

সংকলন ক্লাস:

javac -cp . TestVillain.java ChuckNorrisException.java

চালান:

java -cp . TestVillain
Gotcha!
The end.

"রানটাইম এক্সেপশন প্রসারিত করে" মন্তব্য করুন এবং কেবল পুনরায় কম্পাইল করুনChuckNorrisException.java :

javac -cp . ChuckNorrisException.java

চালান:

java -cp . TestVillain
Exception in thread "main" java.lang.VerifyError: (class: TestVillain, method: main signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
Could not find the main class: TestVillain.  Program will exit.

যাচাইকরণ ছাড়াই চালান:

java -Xverify:none -cp . TestVillain
The end.
Exception in thread "main"

18
ঠিক আছে, তাহলে আপনি যদি তার Objectপরিবর্তে ধরেন Throwableতবে কি? (সংকলক এটির অনুমতি দেয় না, তবে যেহেতু আমরা ইতিমধ্যে
ভেরিফায়ারটি

11
জাভাতে আপনি কী নিক্ষেপ করতে পারেন সেই অনুসারে আপনি এখনও এমন জিনিসগুলি ধরতে পারেন যা নিক্ষেপযোগ্য প্রসারণ না করে তবে তাদের নিক্ষেপ করা এবং ধরা অপরিবর্তিত আচরণ।
ভোল্টাইলড্রিম

8
@ dzieciou তারা একসাথে সত্য হতে পারে আপনার প্রসেসরের ধরণে আপনার অপারেটিং সিস্টেমের নির্দিষ্ট সংস্করণে জাভা পরিবেশের আপনার সংস্করণ ব্যবহার করে আপনি সেগুলি ধরতে সক্ষম হতে পারেন। তবে এটি ধরা পড়তে পারে কিনা তা স্ট্যান্ডার্ডে উল্লেখ না করা থাকলে এটিকে অপরিজ্ঞাত আচরণ বলা হয়, কারণ জাভার অন্যান্য বাস্তবায়নগুলি এটিকে ক্যাচ করতে সক্ষম হিসাবে বেছে নিতে পারে।
heinrich5991

2
Hmmph। আমি আশা করছিলাম যে 176 টি আপভোটের জন্য, আপনি এমন কিছু জেএনআই কোড লিখেছেন যা আপনার ব্যতিক্রমটিকে পুনর্বিবেচনার জন্য পুরো কল স্ট্যাকটি বানর-প্যাচ করে (অবশ্যই কর্টর দ্বারা ডাকা)।
কেডগ্রিগরি

3
এই সবগুলি করার সময়, একটি পায়ে দাঁড়াতে, ডিক্সিতে হুইসেল করার সময় আপনার মাথায় থাপ্পড় দিয়ে এবং পেটে ঘষে ফেলা খুব দুর্দান্ত ধারণা ...;);)
গ্লেন বেস্ট

120

এটি চিন্তা করার পরে, আমি সফলভাবে একটি অপ্রকাশনীয় ব্যতিক্রম তৈরি করেছি। আমি JulesWinnfieldচকের চেয়ে বরং এর নামকরণ বেছে নিয়েছি , কারণ এটি এক মাশরুম-মেঘ-পাড়ার-মা-ব্যতিক্রম। তদুপরি, আপনার মনে যেটি ছিল ঠিক তেমনটি নাও হতে পারে তবে এটি অবশ্যই ধরা যায় না। পালন:

public static class JulesWinnfield extends Exception
{
    JulesWinnfield()
    {
        System.err.println("Say 'What' again! I dare you! I double dare you!");
        System.exit(25-17); // And you shall know I am the LORD
    }
}


public static void main(String[] args)
{       
    try
    {
        throw new JulesWinnfield();
    } 
    catch(JulesWinnfield jw)
    {
        System.out.println("There's a word for that Jules - a bum");
    }
}

এট ভয়েলা! অপ্রকাশিত ব্যতিক্রম।

আউটপুট:

সঞ্চালন করুন:

আবার 'কি' বলুন! আমি তোমাকে সাহস! আমি তোমাকে দ্বিগুণ সাহস করি!

জাভা ফলাফল: 8

বিল্ড সাফল্য (মোট সময়: 0 সেকেন্ড)

যখন আমার আরও কিছুটা সময় থাকবে, আমি দেখব যে আমি অন্য কিছু নিয়ে আসতে পারি না কিনা।

এছাড়াও, এটি পরীক্ষা করে দেখুন:

public static class JulesWinnfield extends Exception
{
    JulesWinnfield() throws JulesWinnfield, VincentVega
    {
        throw new VincentVega();
    }
}

public static class VincentVega extends Exception
{
    VincentVega() throws JulesWinnfield, VincentVega
    {
        throw new JulesWinnfield();
    }
}


public static void main(String[] args) throws VincentVega
{

    try
    {
        throw new JulesWinnfield();
    }
    catch(JulesWinnfield jw)
    {

    }
    catch(VincentVega vv)
    {

    }
}

স্ট্যাকের উপচে পড়ার কারণ - আবার, ব্যতিক্রমগুলি অবিরত রয়েছে।


32
আপনার উত্তরে স্ট্যাক ওভারফ্লো ব্যবহারের জন্য +1। মজা করছি, সত্যিই ভাল উত্তর।
জোশিয়ার

7
একটি যথাযথ "অপরিবর্তনযোগ্য ব্যতিক্রম" নিশ্চিত করবে যে সবগুলি বন্ধ করে দেওয়া অবশেষে ব্লকগুলি কোনও হস্তক্ষেপকারী ক্যাচ ছাড়াই কার্যকর করা হবে। সিস্টেমকে হত্যা করা ব্যতিক্রম নয় - এটি কেবল সিস্টেমকে মেরে ফেলে।
সুপারক্যাট

4
আপনি কিভাবে "নিক্ষেপ" করবেন JulesWinfield? সিস্টেমটি ছোঁড়ার আগেই কি চিৎকার থামবে না?
সুপারক্যাট

6
@ মিমি দ্য লাইয়ার: কনস্ট্রাক্টরের সময় সিস্টেমটি প্রস্থান করে, তাই না? বিবৃতিটি throw new Whatever()সত্যই দুটি অংশ: Whatever it = new Whatever(); throw it;এবং সিস্টেমটি দ্বিতীয় অংশে পৌঁছানোর আগেই মারা যায়।
সুপারক্যাট

5
@ মাইকে দ্য লিয়ার আপনি আসলে খুব সহজেই জুলস বা ভিনসেন্টকে ধরতে পারবেন ... যদি আপনি এটি ছুঁড়ে ফেলার ব্যবস্থা করেন। আপনি ফেলতে পারবেন না এমন একটি ব্যতিক্রম তৈরি করা সহজ:class cn extends exception{private cn(){}}
জন ডিভোরাক

85

যেমন একটি ব্যতিক্রম সঙ্গে এটি অবশ্যই নির্মাতা থেকে একটি ব্যবহার বাধ্যতামূলক হবে System.exit(Integer.MIN_VALUE);কারণ আপনি যদি এই ধরনের ব্যতিক্রম ছুঁড়ে ফেলেছিলেন তবে এটি ঘটবে;)


32
+1 টি; আইএমও এটিই একমাত্র সম্ভাব্য সমাধান। একটি অপ্রকাশযোগ্য ব্যতিক্রম হ'ল প্রোগ্রামটি শেষ করা উচিত ...
হোম

7
না, আপনি যখন এই জাতীয় ব্যতিক্রম ছুঁড়ে ফেলেন তখন কি হয় না। একটি অনাবৃত ব্যতিক্রম একটি একক থ্রেডকে শেষ করে দেবে, এটি jvm থেকে প্রস্থান করবে না, কিছু প্রসঙ্গে সিস্টেম.এক্সিট নিজেই একটি সুরক্ষা ধারণা তৈরি করতে পারে - কোডের প্রতিটি অংশকে কোনও প্রোগ্রাম বন্ধ করার অনুমতি দেওয়া হয় না।
জোসেফেক্স

3
আপনি while(true){}পরিবর্তে ব্যবহার করতে পারেন System.exit()
পাইওটর প্রস্ম্মো

2
আসলে, আপনি কোনও সুরক্ষা পরিচালক ইনস্টল করে কাজ করা থেকে বিরত রাখতে পারেনSystem.exit() যা এটি অনুমোদিত নয় dis এটি নির্মাণকারীকে একটি ভিন্ন ব্যতিক্রম (সিকিউরিটি এক্সেপশন) হিসাবে রূপান্তরিত করবে, যা ধরা পড়তে পারে।
jtahlorn

5
উম্ম, প্রযুক্তিগতভাবে আপনি কখনও ব্যতিক্রম ছুঁড়ে মারেন নি । আপনি এখনও ফেলতে অবজেক্টটি তৈরি করেন নি!
থমাস এডিং

46

যে কোনও কোড থ্রোয়েবল ধরতে পারে। সুতরাং না, যাই হোক না কেন আপনি ব্যতিক্রমটি থ্রোয়েবলের একটি সাবক্লাস হতে চলেছেন এবং এটি ধরা পড়ার বিষয় হতে পারে।


11
চকনোরিস এক্সসেপশন hangধরার চেষ্টায় থ্রোয়েবল নিজেই চাইবে: পি
পার্মজেনেরর

35
public class ChuckNorrisException extends Exception {
    public ChuckNorrisException() {
        System.exit(1);
    }
}

(মঞ্জুর, প্রযুক্তিগতভাবে এই ব্যতিক্রমটি আসলে কখনও ছুঁড়ে দেওয়া হয় না, তবে যথাযথভাবে ChuckNorrisExceptionনিক্ষেপ করা যায় না - এটি আপনাকে প্রথমে ছুড়ে দেয়))


4
আমার এক সহকর্মী (;;) for} '' এর জন্য 'স্টিকিং' রাখার পরামর্শ দিয়েছিলেন কারণ তিনি অনুভব করেছিলেন যে 'সিস্টেম.এক্সিট' (1) 'কলটি কোনও সুরক্ষা ব্যতিক্রম ছুঁড়ে ফেলতে পারে। আমি এইটিকে সৃজনশীলতার জন্য ভোট দিচ্ছি!
ফিল স্ট্রিট

আমি আপনার উত্তর শেষ সঙ্গে একমত। চকনরিসের সাথে কখনও গণ্ডগোল করবেন না, ব্যতিক্রম বা না।
বেঞ্জ

28

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

আপনি এটা কঠিন হ্যান্ডেল করতে চান, আপনি ওভাররাইড করতে পারে পদ্ধতি getCause(), getMessage(), getStackTrace(), toString()অন্য নিক্ষেপ করা java.lang.ChuckNorrisException


2
হুঁ, ধরা (থ্রোয়েবল টি) কোনও পদ্ধতি কল করুন বা অন্যথায় অবজেক্টটিকে রূপান্তর করুন? একটি ক্যাচ ক্লজটি আরও একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে যার ফলে এটি অসম্ভব হয়ে পড়ে।
কল্টন

1
আমি মনে করি catch(Throwable t)এটি কেবলমাত্র পরিবর্তনশীল হিসাবে সংরক্ষণ করে তাই আমার পরামর্শগুলি কেবলমাত্র পরবর্তী ব্লকে তখনই প্রয়োগ হয় যখন ব্যবহারকারী ব্যতিক্রমগুলি মোকাবেলা করতে চান
মিরেলন

24

আমার উত্তরটি @ জেতাহলবনের ধারণার ভিত্তিতে, তবে এটি সম্পূর্ণরূপে কাজ করা জাভা প্রোগ্রাম, এটি একটি জেআর ফাইলের মধ্যে প্যাকেজ করা যেতে পারে এবং এমনকি ওয়েব অ্যাপ্লিকেশনের অংশ হিসাবে আপনার প্রিয় অ্যাপ্লিকেশন সার্ভারে স্থাপন করা যেতে পারে

প্রথমত, আসুন ChuckNorrisExceptionক্লাসটি সংজ্ঞায়িত করুন যাতে এটি শুরু থেকে জেভিএমকে ক্র্যাশ না করে (চক সত্যিই জেভিএম বিটিডাব্লু বিপর্যয় পছন্দ করে :)

package chuck;

import java.io.PrintStream;
import java.io.PrintWriter;

public class ChuckNorrisException extends Exception {

    public ChuckNorrisException() {
    }

    @Override
    public Throwable getCause() {
        return null;
    }

    @Override
    public String getMessage() {
        return toString();
    }

    @Override
    public void printStackTrace(PrintWriter s) {
        super.printStackTrace(s);
    }

    @Override
    public void printStackTrace(PrintStream s) {
        super.printStackTrace(s);
    }
}

Expendablesএটি নির্মাণে এখন ক্লাস চলে যায় :

package chuck;

import javassist.*;

public class Expendables {

    private static Class clz;

    public static ChuckNorrisException getChuck() {
        try {
            if (clz == null) {
                ClassPool pool = ClassPool.getDefault();
                CtClass cc = pool.get("chuck.ChuckNorrisException");
                cc.setSuperclass(pool.get("java.lang.Object"));
                clz = cc.toClass();
            }
            return (ChuckNorrisException)clz.newInstance();
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }
}

এবং শেষ পর্যন্ত Mainকিছু বাট লাথি মারার ক্লাস:

package chuck;

public class Main {

    public void roundhouseKick() throws Exception {
        throw Expendables.getChuck();
    }

    public void foo() {
        try {
            roundhouseKick();
        } catch (Throwable ex) {
            System.out.println("Caught " + ex.toString());
        }
    }

    public static void main(String[] args) {
        try {
            System.out.println("before");
            new Main().foo();
            System.out.println("after");
        } finally {
            System.out.println("finally");
        }
    }
}

নিম্নলিখিত কমান্ড দিয়ে এটি সঙ্কলন এবং চালনা:

java -Xverify:none -cp .:<path_to_javassist-3.9.0.GA.jar> chuck.Main

আপনি নিম্নলিখিত আউটপুট পাবেন:

before
finally

অবাক হওয়ার কিছু নেই - এটি সর্বোপরি :)


খুব সুন্দর! ক্লাস সংজ্ঞা নিজেই ম্যানিপুলেশন দিয়ে খুব একটা করেনি। আপনার কি এখনও কমান্ডলাইনে "যাচাই করুন: কিছুই নেই" দরকার?
jtahlorn

@ জাজাহলবোন হ্যাঁ, "যাচাই করুন: কিছুই নেই" ছাড়াই কোনও বস্তু থ্রোয়েবলের বংশধর না হয়ে নিক্ষেপ করার চেষ্টা ব্যর্থ হয়।
ওয়াইল্ডফায়ার

ওহ, আমি এই প্রতিবন্ধকতাটি কোনওরকমভাবে পেয়েছিলাম। তাহলে এটি আমার উত্তর থেকে কীভাবে আলাদা?
jtahlorn

2
মূল পার্থক্য হ'ল এটি কম্পাইল-টাইম হ্যাকিং ছাড়াই জাভা কোডটি কাজ করছে
ওয়াইল্ডফায়ার

15

কনস্ট্রাক্টরে আপনি একটি থ্রেড শুরু করতে পারেন যা বারবার কল করে originalThread.stop (ChuckNorisException.this)

থ্রেডটি বারবার ব্যতিক্রমটিকে ধরতে পারে তবে মারা না যাওয়া পর্যন্ত তা ছুঁড়ে মারতে থাকবে।


13

না। জাভাতে সমস্ত ব্যতিক্রম অবশ্যই সাবক্লাসে আবশ্যক java.lang.Throwable, এবং যদিও এটি ভাল অনুশীলন নাও হতে পারে তবে আপনি প্রতিটি ধরণের ব্যতিক্রমকে এভাবে ধরতে পারেন:

try {
    //Stuff
} catch ( Throwable T ){
    //Doesn't matter what it was, I caught it.
}

দেখুন java.lang.Throwable আরও তথ্যের জন্য ডকুমেন্টেশন।

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


9

প্রকৃতপক্ষে গৃহীত উত্তরটি এত সুন্দর নয় কারণ জাভা যাচাইকরণ ছাড়াই চালানো দরকার, অর্থাৎ কোডটি সাধারণ পরিস্থিতিতে কাজ করবে না।

আসল সমাধানের জন্য অ্যাসপেক্টজে উদ্ধার !

ব্যতিক্রম শ্রেণি:

package de.scrum_master.app;

public class ChuckNorrisException extends RuntimeException {
    public ChuckNorrisException(String message) {
        super(message);
    }
}

অ্যাসপেক্ট:

package de.scrum_master.aspect;

import de.scrum_master.app.ChuckNorrisException;

public aspect ChuckNorrisAspect {
    before(ChuckNorrisException chuck) : handler(*) && args(chuck) {
        System.out.println("Somebody is trying to catch Chuck Norris - LOL!");
        throw chuck;
    }
}

নমুনা প্রয়োগ:

package de.scrum_master.app;

public class Application {
    public static void main(String[] args) {
        catchAllMethod();
    }

    private static void catchAllMethod() {
        try {
            exceptionThrowingMethod();
        }
        catch (Throwable t) {
            System.out.println("Gotcha, " + t.getClass().getSimpleName() + "!");
        }
    }

    private static void exceptionThrowingMethod() {
        throw new ChuckNorrisException("Catch me if you can!");
    }
}

আউটপুট:

Somebody is trying to catch Chuck Norris - LOL!
Exception in thread "main" de.scrum_master.app.ChuckNorrisException: Catch me if you can!
    at de.scrum_master.app.Application.exceptionThrowingMethod(Application.java:18)
    at de.scrum_master.app.Application.catchAllMethod(Application.java:10)
    at de.scrum_master.app.Application.main(Application.java:5)

8

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

এখানে একটি সহায়ক শ্রেণি যা আপনাকে কিছু ছুঁড়ে মারতে, ঘোষিত বা না করতে দেয়:

public class SneakyThrow {
  public static RuntimeException sneak(Throwable t) {
    throw SneakyThrow.<RuntimeException> throwGivenThrowable(t);
  }

  private static <T extends Throwable> RuntimeException throwGivenThrowable(Throwable t) throws T {
    throw (T) t;
  }
}

এখন throw SneakyThrow.sneak(new ChuckNorrisException());একটি ChuckNorrisException নিক্ষেপ করে না, তবে সংকলকটি এতে অভিযোগ করে

try {
  throw SneakyThrow.sneak(new ChuckNorrisException());
} catch (ChuckNorrisException e) {
}

চকনরিস এক্সসেপশন যদি চেক করা ব্যতিক্রম হয় তবে ছুঁড়ে দেওয়া হয় না এমন ব্যতিক্রম ধরা সম্পর্কে about


6

শুধুমাত্র ChuckNorrisExceptionজাভা গুলি হওয়া উচিত OutOfMemoryErrorএবং StackOverflowError

আপনি প্রকৃতপক্ষে এগুলিকে "ধরা" দিতে পারেন যে catch(OutOfMemoryError ex)ব্যতিক্রমটি ছুঁড়ে ফেলা হলে এটি কার্যকর করা হবে, তবে সেই ব্লকটি কলারের কাছে ব্যতিক্রমটি স্বয়ংক্রিয়ভাবে পুনর্বিবেচনা করবে।

আমি মনে করি public class ChuckNorrisError extends Errorনা এটি কৌশলটি করে তবে আপনি এটি চেষ্টা করে দেখতে পারেন। আমি প্রসারিত করার বিষয়ে কোনও নথিপত্র পাইনিError


2
ত্রুটি এখনও এত কোন উপায় সংক্রামক প্রতিরোধ নিক্ষেপযোগ্য প্রসারিত করে। এটি জাভা ভাষার নকশা দ্বারা।
জেসনএম 1

1
@ জেসনএম 1 আমি মনে করি না যে ওপি প্রকৃতপক্ষে "অপ্রকাশযোগ্য" ব্যতিক্রম চেয়েছিল, এবং আমি বোঝাতে চাইছি ত্রুটি এটি ধরা পড়লেও প্রচার করে। সুতরাং, যে কোনও থ্রোয়েবল ক্যাচযোগ্য, তবে শেষ পর্যন্ত এই দু'টিই আপনার প্রচার
-প্রবর্তন

কৌতুকপূর্ণ চকনরিস ধারণাটি থ্রোয়েবলকে সরাসরি প্রসারিত করতে পারে তবে এটি ব্যতিক্রম বা ত্রুটি হবে না!
জেসনএম 1

4
আপনি এটি ধরলেও ত্রুটিটি প্রচার করে না , আপনি কোথায় এই ধারণা পেয়েছিলেন তা নিশ্চিত not
jtahlorn

3
আমার মনে হয় আপনি এরোস সম্পর্কে ভালই বিভ্রান্ত হয়ে পড়েছেন, এগুলি থ্রোয়েবল বা এমনকি থ্রোয়েবল প্রসারণযোগ্য সমস্ত কিছুর মতো স্বাভাবিক ব্যতিক্রম।
বেটসেস

6

Is it possible to construct a snippet of code in java that would make a hypothetical java.lang.ChuckNorrisException uncatchable?

হ্যাঁ, এবং এখানে উত্তর: আপনার java.lang.ChuckNorrisExceptionএমন ডিজাইন করুন এটির উদাহরণ নয় java.lang.Throwable। কেন? অবিশ্বাস্য অবজেক্টটি সংজ্ঞা অনুসারে অপ্রয়োজনীয় কারণ আপনি কখনও এমন কিছু ধরতে পারবেন না যা কখনও ছুঁড়ে দেওয়া যায় না।


2
তবে তারপরেও ব্যতিক্রম নয়।
ডলবি

8
@ ডলবি: আমি ওপির প্রশ্নে এমন কোনও জায়গা খুঁজে পাচ্ছি না যে রাজ্যগুলি java.lang.ChuckNorrisExceptionঅবশ্যই একটি ব্যতিক্রম হতে হবে, একাকী হতে হবে
টমাস এডিং

1
আমি অনুমান করি যে এটি বর্ণিত নয়, তবে এটি নিহিত। আপনি একজন গণিতবিদ :-), আপনি না?
ডলবি

3

আপনি চকনরিসকে অভ্যন্তরীণ বা ব্যক্তিগত রাখতে পারেন এবং তাকে আবদ্ধ করতে পারেন বা তাকে গজিয়ে তোলা করতে পারেন ...

try { doChuckAction(); } catch(ChuckNorrisException cne) { /*do something else*/ }


7
আমি বিশ্বাস করি না যে ধারণাটি এটি ধরা হয়েছিল। তাহলে আমার ধারনাই মনে হয় প্রতিরোধ এটা ধরা হচ্ছে থেকে।
প্যাট্রিক রবার্টস

আমি ভুল হলে আমাকে সংশোধন করুন তবে আপনি যদি এটি অভ্যন্তরীণ করেন তবে প্রতিবিম্ব ছাড়া আপনি এটিকে পেতে পারবেন না।
জে

5
হ্যাঁ, তবে যতক্ষণ আপনি ব্যতিক্রম বা থ্রোয়েবল ধরতে পারবেন ততক্ষণ প্রকৃত ধরণের দৃশ্যমানতা অপ্রাসঙ্গিক।
কিথস

3

জাভাতে ব্যতিক্রম হ্যান্ডলিংয়ের সাথে দুটি মৌলিক সমস্যা হ'ল এটি ব্যতিক্রমের ধরণটি ব্যবহার করে তার উপর ভিত্তি করে ব্যবস্থা নেওয়া উচিত কিনা তা নির্দেশ করার জন্য এবং যে কোনও কিছু ব্যতিক্রমের ভিত্তিতে ব্যবস্থা গ্রহণ করে (যেমন "ধরা" এটি সমাধান করা হয়) অন্তর্নিহিত অবস্থা। কোনও উপায় রয়েছে যার মাধ্যমে কোনও ব্যতিক্রম বস্তু সিদ্ধান্ত নিতে পারে যে কোন হ্যান্ডলারের মৃত্যুদন্ড কার্যকর করা উচিত এবং যে হ্যান্ডলারগুলি এখনও অবধি সম্পাদন করেছে তা বর্তমান পদ্ধতির জন্য প্রস্থান শর্তগুলি পূরণ করার জন্য যথেষ্ট পরিমাণে জিনিস পরিষ্কার করেছে কিনা। যদিও এটি "অপ্রকাশনযোগ্য" ব্যতিক্রম করতে ব্যবহৃত হতে পারে, তার জন্য দুটি আরও বড় ব্যবহার ব্যতিক্রম (1) ব্যতিক্রম করা হবে যা কেবলমাত্র কোড দ্বারা ধরা পড়লে হ্যান্ডেল হিসাবে বিবেচিত হবে যা আসলে কীভাবে তাদের সাথে ডিল করতে হয় তা জানে,finallyFooExceptionএকটি finallyআনওয়ানডিংয়ের সময় একটি ব্লকের সময় BarException, উভয় ব্যতিক্রম কল কলকে প্রচার করতে হবে; উভয়ই ক্যাপচারযোগ্য হওয়া উচিত, তবে উভয়কে ধরা না পড়লে অযাচিত চলতে হবে)। দুর্ভাগ্যক্রমে, আমি মনে করি না যে কিছু ব্যতিক্রম না করে বিদ্যমান ব্যতিক্রম-পরিচালনা কোডটি সেভাবে কাজ করার কোনও উপায় থাকবে।


একটি আকর্ষণীয় ধারণা, তবে আমি মনে করি না যে নিম্ন-স্তরের কোডটি কলকারীর কাছে একটি বিশেষ ব্যতিক্রমের "অর্থ" কী তা বুঝতে পারে, তাই কোন হ্যান্ডলারকে মৃত্যুদন্ড কার্যকর করা উচিত তা সিদ্ধান্ত নেওয়ার পক্ষে সিদ্ধান্ত নেওয়া কখনই বুদ্ধিমান হবে বলে আমি মনে করি না।
jtahlorn

@ জেতাহলবোন: এখনই, থ্রোডার সিদ্ধান্ত নেয় যে ব্যতিক্রম হ্যান্ডলাররা ব্যতিক্রম প্রকারের নির্বাচনের মাধ্যমে কী কার্যকর করা উচিত। এটি কিছু দৃশ্য পরিষ্কারভাবে পরিচালনা করা অসম্ভবকে অসম্ভব করে তোলে। অন্যান্য জিনিসের মধ্যে: (১) finallyব্লক পূর্বের ব্যতিক্রমগুলি থেকে পরিষ্কার করার সময় যদি কোনও ব্যতিক্রম ঘটে থাকে তবে এটি সম্ভবত সম্ভব যে, ব্যতিক্রম অন্যটির অনুপস্থিতিতে, এমন কোনও কিছু হতে পারে যার কোডটি হ্যান্ডেল করার এবং চালিয়ে যাওয়ার প্রত্যাশা করবে, তবে এটি একটি পরিচালনা এবং অন্যটিকে উপেক্ষা করা খারাপ হবে। উভয় হ্যান্ডলারগুলি প্রক্রিয়া করবে এমন একটি যৌগিক ব্যতিক্রম উত্পাদন করার মতো কোনও ব্যবস্থা নেই।
সুপারক্যাট

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

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

@ জেতাহলবোন: আমার উদ্দেশ্য ছিল ভার্চুয়াল পদ্ধতিগুলি বিশেষত "গতিশীল" কিছু বাস্তবায়িত করা উচিত নয়, তবে মূলত বলতে হবে যে "নির্দেশিত ধরণের কোনও শর্ত আছে যা নিয়ে কাজ করা উচিত"। একটি জিনিস আমি উল্লেখ করতে ভুলে গেছি, তা হ'ল এমন একটি মাধ্যম হওয়া উচিত যার মাধ্যমে কলগুলি Fooএকটি ব্যতিক্রমের মধ্যে পার্থক্য করতে পারে যা Fooনিজেই ছুঁড়ে মারে বা ইচ্ছাকৃতভাবে নিজেকে ছুঁড়ে মারে এমন ভান করতে চায়, যা Fooএমনটি হওয়ার আগে যখন এটি প্রত্যাশিত ছিল না অন্য কিছু পদ্ধতি কল করা। "পরীক্ষিত" ব্যতিক্রমগুলির ধারণাটি "সম্পর্কে" হওয়া উচিত।
সুপারক্যাট

1

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

Throwable exception = /* ... */;
Thread currentThread = Thread.currentThread();
Thread.UncaughtExceptionHandler uncaughtExceptionHandler =
    currentThread.getUncaughtExceptionHandler();
uncaughtExceptionHandler.uncaughtException(currentThread, exception);
// May be reachable, depending on the uncaught exception handler.

এটি প্রকৃতপক্ষে (খুব বিরল) পরিস্থিতিতে কার্যকর, উদাহরণস্বরূপ যখন সঠিক Errorপরিচালনা করার প্রয়োজন হয় তবে পদ্ধতিটি ফ্রেমওয়ার্ক থেকে যে কোনওটিকে ধরার (এবং ত্যাগ করা) থেকে নেওয়া হয় Throwable


0

সিস্টেম.এক্সিটকে (1) এ কল করুন finalizeএবং কেবলমাত্র অন্যান্য সমস্ত পদ্ধতি থেকে ব্যতিক্রমের একটি অনুলিপি ফেলুন, যাতে প্রোগ্রামটি প্রস্থান হতে পারে।

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