সি ++ সমস্ত ব্যতিক্রম ধরা


244

জাভা এর সমান একটি সি ++ আছে কি?

try {
    ...
}
catch (Throwable t) {
    ...
}

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



2
নোট করুন যে সর্বাধিক ক্র্যাশগুলি সি ++ ব্যতিক্রমের কারণে হয় না। আপনি সমস্ত ব্যতিক্রম ধরতে পারেন, তবে এটি অনেক ক্র্যাশ আটকাবে না।
হাঁসকে

উত্তর:


335
try{
    // ...
} catch (...) {
    // ...
}

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

try{
    // ...
} catch (const std::exception& ex) {
    // ...
} catch (const std::string& ex) {
    // ...
} catch (...) {
    // ...
}

68
কনস্টেরেন্স রেফারেন্স দিয়ে ব্যতিক্রম ধরা ভাল অনুশীলন। যেমন রয়েছে: ধরা (এসটিডি :: ব্যতিক্রম কনস্ট্যান্ড ও প্রাক্তন) {/ * ... * /}
কোরিয়ান

12
@ কোরিয়ান: কনস্ট্যান্ট রেফারেন্স ধরে ধরা ভাল অভ্যাস কেন?
টিম এমবি

19
অপ্রয়োজনীয় অনুলিপি এড়ানো একটি সুবিধা one
গ্রেগ ডি

21
-1: এই পরামর্শটি "" সি +++ তে সমস্ত ব্যতিক্রম ধরা ফেলবে "তা বিভ্রান্তিকর। চেষ্টা ব্লকের ভিতরে শূন্য ত্রুটি দ্বারা একটি ভাগ তৈরি করার চেষ্টা করুন। আপনি দেখতে পাবেন যে এটি ধরা পড়েনি এমন একটি ব্যতিক্রম উত্পন্ন করবে, তবুও কোডটি পরিষ্কারভাবে সি ++ এ রয়েছে। এটি আরও সহায়ক হবে যে এটি "সমস্ত সি ++ ব্যতিক্রমগুলি ধরবে" এবং তারপরে সীমাবদ্ধ উপযোগিতার উপর নোটগুলিতে কাঠামোগত ব্যতিক্রমগুলির কিছু উল্লেখ যুক্ত করবে state
ওমাতাই

42
@ ওমাটাই: ফিক্সড, এটি সমস্ত সি ++ ব্যতিক্রমকে ধরবে। শূন্য দ্বারা বিভাজন নির্ধারিত আচরণ এবং কোনও সি ++ ব্যতিক্রম উত্পন্ন করে না।
মাকিং হাঁস

151

কারও যোগ করা উচিত যে সি ++ কোডে "ক্র্যাশগুলি" ধরা যায় না। এগুলি ব্যতিক্রম ছুঁড়ে না, তবে তারা যা পছন্দ করে তা করে। নাল-পয়েন্টার অবজ্ঞা বলার কারণে আপনি যখন কোনও প্রোগ্রাম ক্র্যাশ করছেন দেখেন, এটি অনির্ধারিত আচরণ করে। নেই std::null_pointer_exception। ব্যতিক্রমগুলি ধরার চেষ্টা করে সেখানে কোনও লাভ হবে না।

কেবল মামলার জন্য কেউ এই থ্রেডটি পড়ছে এবং মনে করে যে প্রোগ্রামটি ক্র্যাশের কারণ সে পেতে পারে। পরিবর্তে gdb এর মতো একটি ডিবাগার ব্যবহার করা উচিত।


4
ভাল, শাই যেমন উল্লেখ করেছেন, ভিসি সংকলক দিয়ে এটি সম্ভব। এটি ভাল ধারণা নয়, তবে এটি সম্ভব is
শোগ 9

7
হ্যাঁ এসইএইচ সহ তবে বুদ্ধিমান স্ট্যান্ডার্ড সি ++ কৌশল সহ নয় :) ভাল আপনি উইন্ডোতে
লেগে

1
মিমি ... এই টিডিবিটের জন্য ধন্যবাদ। আমার নাল পয়েন্টার ব্যতিক্রমগুলি কেন ধরা পড়ছে না সে সম্পর্কে আমি উত্তরটি খুঁজছিলাম!
ডালিন সেয়েভরাইট

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

1
@ অ্যাডামরোসনফিল্ড যতক্ষণ না আপনি try { .. } catch(...) { ... }সিগন্যাল / সিগিগেশন ব্যবহারের জন্য প্রয়োগ করেছেন, আমি এটিকে "ধরা" বলব না :) যদি কোনও সিগন্যাল হ্যান্ডলারে থাকে তবে প্রোগ্রামারটির পক্ষে কোডটি ক্র্যাশ কোথায় ঘটেছে তা জানা অপেক্ষাকৃত কঠিন (আমি কথা বলছি) প্রোগ্রামের সাথে এটি সনাক্তকরণ সম্পর্কে), চেষ্টা / ধরার তুলনায়।
জোহানেস স্কাউব - 21

72

এইভাবে আপনি catch(...)জিসিসির সাথে (তৃতীয় পক্ষের লাইব্রেরি থেকে অজানা ধরার সময় দরকারী হতে পারে) আপনার অভ্যন্তরের ব্যতিক্রম প্রকারটি রিভার্স-ইঞ্জিনিয়ার করতে পারেন :

#include <iostream>

#include <exception>
#include <typeinfo>
#include <stdexcept>

int main()
{
    try {
        throw ...; // throw something
    }
    catch(...)
    {
        std::exception_ptr p = std::current_exception();
        std::clog <<(p ? p.__cxa_exception_type()->name() : "null") << std::endl;
    }
    return 1;
}

এবং যদি আপনি বুস্ট ব্যবহারের সামর্থ্য রাখেন তবে আপনি আপনার ক্যাচ বিভাগটিকে আরও সহজ করে তুলতে পারেন (বাইরের দিকে) এবং সম্ভাব্য ক্রস প্ল্যাটফর্ম

catch (...)
{
    std::clog << boost::current_exception_diagnostic_information() << std::endl;
}

58
try {
   // ...
} catch (...) {
   // ...
}

মনে রাখবেন যে ...অভ্যন্তরের অভ্যন্তরটি catchএকটি বাস্তব উপবৃত্তাকার, অর্থাৎ ie তিনটি বিন্দু

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


24
সি ++ 11 এ রয়েছে: চেষ্টা করুন {স্টাড :: স্ট্রিং ()। এ (1); // এটি একটি স্ট্যান্ড উত্পন্ন করে: আউট_ অফ_রেঞ্জ} ক্যাচ (...) pt এপ্ট্র = স্টডি :: কারেন্ট_ এক্সসেপশন (); // ক্যাপচার}
মোহাম্মদ আলাগান

2
@ ফোফোনইন: আচ্ছা হ্যাঁ, তবে আমি বলেছিলাম যে catchবিদ্যমান কোড প্লেসোল্ডারকে একটি মন্তব্যে ( // ...) যা স্পষ্টতই সি ++ সিনট্যাক্স নয় তা থেকে নির্দিষ্টকারীকে আলাদা করতে ।
গ্রেগ হিউগিল

1
@ গ্রেগ হিউগিল: হ্যাঁ, এটি কেবল টাইপোগ্রাফিক নিটপিকিং ছিল।
bfontaine 17'14

1
@ বিফোনটেন: যথেষ্ট ভাল :)
গ্রেগ হিউগিল

44

পোর্টেবল পদ্ধতিতে সমস্ত ব্যতিক্রম ধরা (সি ++ এ) সম্ভব নয়। এটি কারণ যে কিছু ব্যতিক্রম একটি C ++ প্রসঙ্গে ব্যতিক্রম নয়। এর মধ্যে শূন্য ত্রুটি এবং অন্যদের দ্বারা ভাগ করার মতো বিষয় রয়েছে। এই ত্রুটিগুলি ঘটে গেলে ব্যতিক্রমগুলি ছুঁড়ে ফেলার ক্ষমতা অর্জন করা সম্ভব হয় তবে এটি করা সহজ নয় এবং অবশ্যই বহনযোগ্য পদ্ধতিতে সঠিকভাবে পাওয়া সহজ নয়।

আপনি যদি সমস্ত এসটিএল ব্যতিক্রম ধরতে চান তবে আপনি এটি করতে পারেন

try { ... } catch( const std::exception &e) { ... }

কোনটি আপনাকে ব্যবহার করতে দেয় e.what(), যা একটি ফেরত দেয় যা আপনাকে const char*ব্যতিক্রম সম্পর্কে নিজেই আরও কিছু বলতে পারে। এটি জাভা কনস্ট্রাক্টের অনুরূপ এমন কনস্ট্রাক্ট যা আপনি সবচেয়ে বেশি জিজ্ঞাসা করেছিলেন।

যদি কেউ উত্তরাধিকারসূত্রে না হয় এমন কোনও ব্যতিক্রম ছুঁড়ে ফেলার মতো যথেষ্ট বোকা হয় তবে এটি আপনাকে সাহায্য করবে না std::exception


2
কেন এটি শীর্ষে নেই?
ইভান সানজ-কারাসা

31

সংক্ষেপে, ব্যবহার করুন catch(...)। যাইহোক, দয়া করে মনে রাখবেন catch(...)বোঝানো হয় সাথে ব্যবহার করা throw;মূলত:

try{
    foo = new Foo;
    bar = new Bar;
}
catch(...)       // will catch all possible errors thrown. 
{ 
    delete foo;
    delete bar;
    throw;       // throw the same error again to be handled somewhere else
}

এটি ব্যবহারের সঠিক উপায় catch(...)


6
মেমরি পরিচালনার জন্য আরএআইআই ব্যবহার করা আরও ভাল যা স্বয়ংক্রিয়ভাবে এই ব্যতিক্রম পরিস্থিতিগুলি পরিচালনা করে।
paykoob

1
@ পেয়াকুব কীভাবে এটি পরিচালনা করে যেখানে আপনি একটি নতুন ফু তৈরি করার চেষ্টা করেছিলেন তবে এটি একটি বারে ব্যর্থ হয়েছিল। অথবা যখন বারের কনস্ট্রাক্টর কোনও ফাইল খোলার চেষ্টা করে তবে ব্যর্থ হয় এবং তাই নিক্ষেপ করে। তারপরে আপনি একটি বিপজ্জনক ফু দিয়ে শেষ করতে পারেন
মেললেস্টার

2
@ মেলস্টের্ক এই ক্ষেত্রে কি স্ট্যাকটি পরিষ্কার হবে না, যা Fooধ্বংসকারীকে চালিত করবে ? আমি ভেবেছিলাম এটি RAII এর পুরো পয়েন্ট। তবে, যদি আপনার স্ট্যাকের উপর ভিত্তি করে Fooতৈরির পরিবর্তে কোনও পয়েন্টার প্রয়োজন হয় Foo, তবে আপনাকে স্ট্যাকের মধ্যে ঘোষিত অন্য কোনও কিছুতে পয়েন্টারটি মোড়ানো দরকার।
রিরাব

হ্যাঁ Auto foo = std :: make_unique <Foo> (); অটো বার = স্টডি :: মেক_উনিক <বার> (); // ব্যতিক্রম নিরাপদ এবং ফাঁস হবে না, কোন ধরা পড়বে না (...)
পলম

এই উত্তরটি কেবলমাত্র আলোচনার জন্য শুরু
হলেই

21

এটি লিখে এটি করা সম্ভব:

try
{
  //.......
}
catch(...) // <<- catch all
{
  //.......
}

তবে এখানে একটি খুব সহজেই লক্ষ্যণীয় ঝুঁকি নেই: আপনি tryব্লকটিতে ফেলে আসা সঠিক ত্রুটিটি খুঁজে পেতে পারেন না , সুতরাং এই ধরণের ব্যবহার করুন catchযখন আপনি নিশ্চিত হন যে ব্যতিক্রমের প্রকারটি যাই হোক না কেন, প্রোগ্রামটি অবশ্যই অবিরত থাকবে catchব্লক সংজ্ঞায়িত ভাবে ।


31
আমি আশা করি যে একটি উচ্চতর উত্তর সরবরাহের প্রায় 5 বছর পরে আপনি কোনও প্রশ্নের উত্তর দেওয়ার জন্য কিছুটা ব্যাজ পেয়ে গেছেন!

4
@DrEval হিসাবে আপনি আকাঙ্ক্ষিত;) stackoverflow.com/help/badges/17/necromancer?userid=2580505
আন্দ্রিয়াস

18

তুমি ব্যবহার করতে পার

catch(...)

তবে এটি খুব বিপজ্জনক। জন ডিবিগিং উইন্ডোজ বইতে জন রবিনস একটি সত্যই বাজে বাগ সম্পর্কে যুদ্ধের গল্প বলেছেন যা ধরা পড়ার (...) কমান্ড দ্বারা মুখোশযুক্ত ছিল। আপনি নির্দিষ্ট ব্যতিক্রম ধরা অনেক ভাল off আপনার চেষ্টা ব্লকটি যুক্তিসঙ্গতভাবে ছুঁড়ে ফেলতে পারে বলে মনে করেন তা ধরুন, তবে সত্যিই অপ্রত্যাশিত কিছু ঘটলে কোডটি একটি ব্যতিক্রমকে আরও উপরে ফেলে দেয়।


1
আমি এইগুলির কিছু ব্যবহারের মাত্রায় ধরা পড়েছি এবং সেই পর্যায়ে কিছু লগিংয়ের জন্য পেপার করেছি। ব্যতিক্রম সহ কিছুই না করা অবশ্যই ঝামেলার জন্য জিজ্ঞাসা করছে।
jxramos

15

আমাকে এখানে এটি উল্লেখ করতে দিন: জাভা

try 
{
...
}
catch (Exception e)
{
...
}

সব ব্যতিক্রম না ধরতে পারে! আমি আসলে এই ধরণের জিনিস আগে ঘটেছিলাম, এবং এটি উন্মাদ-উদ্দীপক; ব্যতিক্রম থ্রোয়েবল থেকে প্রাপ্ত। আক্ষরিক অর্থে, সমস্ত কিছু ধরার জন্য, আপনি ব্যতিক্রমগুলি ধরতে চান না; আপনি থ্রোয়েবল ধরতে চান

আমি জানি এটি নিটপিকি বলে মনে হচ্ছে, তবে যখন আপনি চেষ্টা করেছিলেন এমন কয়েকটি কোড "অনুপযুক্ত ব্যতিক্রম" কোথা থেকে এসেছে যেখানে ধরা দেওয়ার চেষ্টা করে ... ক্যাচ (ব্যতিক্রম ই) "ব্লকটি এসেছে তখন এটি আটকে যায় আপনি.


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

1
রানটাইম ব্যতিক্রম নয় যা বেশিরভাগ সময় গুডপ্রগ্রামআর অপ্রত্যাশিত ব্যতিক্রম !!!
অস্কারলাইজ

3
আমাদের আউট অফ মেমরিরির ধরা পড়ার কারণে জিনিস মারার পরিবর্তে ক্যাচ (থ্রোয়েবল) ব্লকের কারণে সত্যিই মারাত্মক ত্রুটি হয়েছিল ...
ট্রেজকাজ

1
অবশ্যই catch(Exception)জাভাতে সমস্ত ব্যতিক্রম ধরা নাও পারে, আপনি এটি সি # ... জাভা = catch(Thowable), সি # = এর সাথে মিশে যাচ্ছেন catch(Exception)। তাদের বিভ্রান্ত করবেন না।
শেফ ফেরাউন

2
@ অস্কার রাইজ এটির মতো শোনাচ্ছে CoderMalfunctionError(যা আসলে একটি জাভা Errorউপক্লাস ... যদিও এর অর্থ এটি কী মনে হচ্ছে তা বোঝায় না))
রিরাব

9

ঠিক আছে, উদাহরণস্বরূপ আপনি যদি একটি মিনিডাম্প তৈরি করতে সমস্ত ব্যতিক্রম ধরতে চান ...

উইন্ডোজে কাজটি কেউ করেছেন।

Http://www.codeproject.com/Articles/207464/Exception-Handling-in-Visual-Cplusplus দেখুন নিবন্ধে, তিনি ব্যাখ্যা করেছেন যে কীভাবে তিনি সমস্ত ধরণের ব্যতিক্রম ধরতে পারেন এবং তিনি কোড সরবরাহ করেন যা কাজ করে।

আপনি যে তালিকাটি ধরতে পারেন তা এখানে:

 SEH exception
 terminate
 unexpected
 pure virtual method call
 invalid parameter
 new operator fault 
 SIGABR
 SIGFPE
 SIGILL
 SIGINT
 SIGSEGV
 SIGTERM
 Raised exception
C++ typed exception

এবং ব্যবহার: সিসক্র্যাশহ্যান্ডলার সিএইচ; ch.SetProcessExceptionHandlers (); // এক থ্রেডের জন্য এটি করুন ch.SetThreadExceptionHandlers (); // প্রতিটি thred জন্য


ডিফল্টরূপে, এটি বর্তমান ডিরেক্টরিতে একটি মিনিডাম্প তৈরি করে (ক্র্যাশডম্প.ডম্প)


4

একটি জেনেরিক ব্যতিক্রম ধরা পদ্ধতি অত্যন্ত কার্যকর প্রমাণিত হবে।

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

আপনি যা চান তা একটি ডিবাগার ...


13
আমি একমত নই, রিয়েল টাইম অ্যাপ্লিকেশনগুলিতে প্রচুর মামলা রয়েছে যেখানে আমি বরং অজানা ব্যতিক্রমটি ধরতে পারি , লগতে কিছু লিখি / অ্যাপ্লিকেশনটি ক্র্যাশ না দিয়ে বরং কিছু জেনেরিক ত্রুটি কর্মের অনুসরণ করি।
f0ster

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

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

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

  2. দ্বিতীয়ত, আপনি কীভাবে আপনার জেএনআই ডিএলএল বাস্তবায়ন বন্ধ করতে পারেন তা দেখানোর জন্য যে আপনার ডিএলএলে থাকা পদ্ধতিগুলি জেএনআই থেকে প্রবেশ করছে, আপনি সঠিকভাবে ফিরে যাচ্ছেন, ইত্যাদি?

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

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


2

জেএনআই ব্যবহার করে এমন কোনও প্রোগ্রাম সঠিকভাবে ডিবাগ করতে অক্ষম হওয়া সম্পর্কে বাস্তব সমস্যার জন্য (বা কোনও ডিবাগারের অধীনে এটি চালানোর সময় বাগটি উপস্থিত হবে না):

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

এটি প্রায়শই আসল ত্রুটিটি খুঁজে পেতে সহায়তা করবে (যা আশ্চর্যরূপে জাভা কোডে রয়েছে যা ডাকা ফাংশনগুলির শব্দার্থগুলি মানায় না যা কিছু দুষ্টু ডাবল-ফ্রি বা অনুরূপ সৃষ্টি করে) একটি বৃহত্তর সমান্তরাল জাভা প্রোগ্রামটি ডিবাগ করার চেষ্টা করার চেয়ে আরও সহজেই নেটিভ ডিবাগার ...

যদি আপনি কারণটি জানেন তবে কোডটি আপনার মোড়কের পদ্ধতিতে রাখুন যা এড়িয়ে চলে। আপনার জেএনআই কোড ক্র্যাশ ভিএমের চেয়ে আপনার মোড়কের পদ্ধতিগুলি ব্যতিক্রম ছুঁড়ে ফেলা ভাল ...


1

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

সুতরাং ক্র্যাশগুলি সম্পর্কে উপসংহারটি এটি আপনার বিকাশের পরিবেশের মানের উপর নির্ভর করে।

সি ++ স্পেসিফিকেশন বলছে যে ক্যাচ (...) অবশ্যই কোনও ব্যতিক্রম ধরতে পারে, তবে এটি সব ক্ষেত্রে হয় না।

অন্তত আমি যা চেষ্টা করেছিলাম তা থেকে।


1

সচেতন থাকা

try{
// ...
} catch (...) {
// ...
}

কেবল ভাষা-স্তরের ব্যতিক্রম ধরা পড়ে , অন্যান্য নিম্ন-স্তরের ব্যতিক্রমগুলি / ত্রুটিগুলি পছন্দ করে Access Violationএবং Segmentation Faultধরা পড়ে না।


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