সি ++ এ ব্যতিক্রম কীভাবে (পর্দার আড়ালে) কাজ করে


109

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

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

ব্যতিক্রমগুলি কীভাবে কাজ করবে?



উত্তর:


105

অনুমান করার পরিবর্তে, আমি সি -+ কোডের একটি ছোট টুকরা এবং কিছুটা পুরানো লিনাক্স ইনস্টল সহ উত্পন্ন কোডটি দেখার সিদ্ধান্ত নিয়েছি।

class MyException
{
public:
    MyException() { }
    ~MyException() { }
};

void my_throwing_function(bool throwit)
{
    if (throwit)
        throw MyException();
}

void another_function();
void log(unsigned count);

void my_catching_function()
{
    log(0);
    try
    {
        log(1);
        another_function();
        log(2);
    }
    catch (const MyException& e)
    {
        log(3);
    }
    log(4);
}

আমি এটি দিয়ে সংকলিত করেছি g++ -m32 -W -Wall -O3 -save-temps -c, এবং উত্পন্ন সমাবেশ ফাইলটি দেখেছি।

    .file   "foo.cpp"
    .section    .text._ZN11MyExceptionD1Ev,"axG",@progbits,_ZN11MyExceptionD1Ev,comdat
    .align 2
    .p2align 4,,15
    .weak   _ZN11MyExceptionD1Ev
    .type   _ZN11MyExceptionD1Ev, @function
_ZN11MyExceptionD1Ev:
.LFB7:
    pushl   %ebp
.LCFI0:
    movl    %esp, %ebp
.LCFI1:
    popl    %ebp
    ret
.LFE7:
    .size   _ZN11MyExceptionD1Ev, .-_ZN11MyExceptionD1Ev

_ZN11MyExceptionD1Evহ'ল MyException::~MyException(), তাই সংকলক সিদ্ধান্ত নিয়েছে যে এটির জন্য ডেস্ট্রাক্টরের একটি অন-লাইন অনুলিপি প্রয়োজন।

.globl __gxx_personality_v0
.globl _Unwind_Resume
    .text
    .align 2
    .p2align 4,,15
.globl _Z20my_catching_functionv
    .type   _Z20my_catching_functionv, @function
_Z20my_catching_functionv:
.LFB9:
    pushl   %ebp
.LCFI2:
    movl    %esp, %ebp
.LCFI3:
    pushl   %ebx
.LCFI4:
    subl    $20, %esp
.LCFI5:
    movl    $0, (%esp)
.LEHB0:
    call    _Z3logj
.LEHE0:
    movl    $1, (%esp)
.LEHB1:
    call    _Z3logj
    call    _Z16another_functionv
    movl    $2, (%esp)
    call    _Z3logj
.LEHE1:
.L5:
    movl    $4, (%esp)
.LEHB2:
    call    _Z3logj
    addl    $20, %esp
    popl    %ebx
    popl    %ebp
    ret
.L12:
    subl    $1, %edx
    movl    %eax, %ebx
    je  .L16
.L14:
    movl    %ebx, (%esp)
    call    _Unwind_Resume
.LEHE2:
.L16:
.L6:
    movl    %eax, (%esp)
    call    __cxa_begin_catch
    movl    $3, (%esp)
.LEHB3:
    call    _Z3logj
.LEHE3:
    call    __cxa_end_catch
    .p2align 4,,3
    jmp .L5
.L11:
.L8:
    movl    %eax, %ebx
    .p2align 4,,6
    call    __cxa_end_catch
    .p2align 4,,6
    jmp .L14
.LFE9:
    .size   _Z20my_catching_functionv, .-_Z20my_catching_functionv
    .section    .gcc_except_table,"a",@progbits
    .align 4
.LLSDA9:
    .byte   0xff
    .byte   0x0
    .uleb128 .LLSDATT9-.LLSDATTD9
.LLSDATTD9:
    .byte   0x1
    .uleb128 .LLSDACSE9-.LLSDACSB9
.LLSDACSB9:
    .uleb128 .LEHB0-.LFB9
    .uleb128 .LEHE0-.LEHB0
    .uleb128 0x0
    .uleb128 0x0
    .uleb128 .LEHB1-.LFB9
    .uleb128 .LEHE1-.LEHB1
    .uleb128 .L12-.LFB9
    .uleb128 0x1
    .uleb128 .LEHB2-.LFB9
    .uleb128 .LEHE2-.LEHB2
    .uleb128 0x0
    .uleb128 0x0
    .uleb128 .LEHB3-.LFB9
    .uleb128 .LEHE3-.LEHB3
    .uleb128 .L11-.LFB9
    .uleb128 0x0
.LLSDACSE9:
    .byte   0x1
    .byte   0x0
    .align 4
    .long   _ZTI11MyException
.LLSDATT9:

আশ্চর্য! সাধারণ কোড পথে কোনও অতিরিক্ত নির্দেশ নেই are সংকলক পরিবর্তে অতিরিক্ত আউট-লাইন ফিক্সআপ কোড ব্লক উত্পন্ন করেছে, ফাংশনটির শেষে একটি টেবিলের মাধ্যমে উল্লেখ করা হয়েছে (যা বাস্তবে এক্সিকিউটেবলের পৃথক বিভাগে রাখা হয়েছে)। এই টেবিলগুলির উপর ভিত্তি করে সমস্ত কাজ স্ট্যান্ডার্ড লাইব্রেরি দ্বারা পর্দার আড়ালে করা হয় ( _ZTI11MyExceptionহয়)typeinfo for MyException )।

ঠিক আছে, এটি আমার জন্য আসলে কোনও আশ্চর্য ছিল না, আমি ইতিমধ্যে জানতাম যে এই সংকলকটি এটি কীভাবে করেছিল। সমাবেশ আউটপুট সঙ্গে অবিরত:

    .text
    .align 2
    .p2align 4,,15
.globl _Z20my_throwing_functionb
    .type   _Z20my_throwing_functionb, @function
_Z20my_throwing_functionb:
.LFB8:
    pushl   %ebp
.LCFI6:
    movl    %esp, %ebp
.LCFI7:
    subl    $24, %esp
.LCFI8:
    cmpb    $0, 8(%ebp)
    jne .L21
    leave
    ret
.L21:
    movl    $1, (%esp)
    call    __cxa_allocate_exception
    movl    $_ZN11MyExceptionD1Ev, 8(%esp)
    movl    $_ZTI11MyException, 4(%esp)
    movl    %eax, (%esp)
    call    __cxa_throw
.LFE8:
    .size   _Z20my_throwing_functionb, .-_Z20my_throwing_functionb

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

  • ব্যতিক্রম টেবিলগুলির সাহায্যে স্ট্যাকটি হাঁটা করুন যতক্ষণ না এটি ব্যতিক্রমটির জন্য কোনও হ্যান্ডলার খুঁজে না পাওয়া যায়।
  • স্ট্যাকটি খুলুন যতক্ষণ না এটি হ্যান্ডলারের কাছে যায়।
  • আসলে হ্যান্ডলারকে কল করুন।

কেবল কোনও মূল্য ফেরত দেওয়ার ব্যয়ের সাথে তুলনা করুন এবং ব্যতিক্রম কেন কেবল ব্যতিক্রমী রিটার্নের জন্য ব্যবহার করা উচিত তা আপনি দেখতে পান।

শেষ করতে, অ্যাসেমব্লির বাকী ফাইলগুলি:

    .weak   _ZTI11MyException
    .section    .rodata._ZTI11MyException,"aG",@progbits,_ZTI11MyException,comdat
    .align 4
    .type   _ZTI11MyException, @object
    .size   _ZTI11MyException, 8
_ZTI11MyException:
    .long   _ZTVN10__cxxabiv117__class_type_infoE+8
    .long   _ZTS11MyException
    .weak   _ZTS11MyException
    .section    .rodata._ZTS11MyException,"aG",@progbits,_ZTS11MyException,comdat
    .type   _ZTS11MyException, @object
    .size   _ZTS11MyException, 14
_ZTS11MyException:
    .string "11MyException"

টাইপফোন ডেটা।

    .section    .eh_frame,"a",@progbits
.Lframe1:
    .long   .LECIE1-.LSCIE1
.LSCIE1:
    .long   0x0
    .byte   0x1
    .string "zPL"
    .uleb128 0x1
    .sleb128 -4
    .byte   0x8
    .uleb128 0x6
    .byte   0x0
    .long   __gxx_personality_v0
    .byte   0x0
    .byte   0xc
    .uleb128 0x4
    .uleb128 0x4
    .byte   0x88
    .uleb128 0x1
    .align 4
.LECIE1:
.LSFDE3:
    .long   .LEFDE3-.LASFDE3
.LASFDE3:
    .long   .LASFDE3-.Lframe1
    .long   .LFB9
    .long   .LFE9-.LFB9
    .uleb128 0x4
    .long   .LLSDA9
    .byte   0x4
    .long   .LCFI2-.LFB9
    .byte   0xe
    .uleb128 0x8
    .byte   0x85
    .uleb128 0x2
    .byte   0x4
    .long   .LCFI3-.LCFI2
    .byte   0xd
    .uleb128 0x5
    .byte   0x4
    .long   .LCFI5-.LCFI3
    .byte   0x83
    .uleb128 0x3
    .align 4
.LEFDE3:
.LSFDE5:
    .long   .LEFDE5-.LASFDE5
.LASFDE5:
    .long   .LASFDE5-.Lframe1
    .long   .LFB8
    .long   .LFE8-.LFB8
    .uleb128 0x4
    .long   0x0
    .byte   0x4
    .long   .LCFI6-.LFB8
    .byte   0xe
    .uleb128 0x8
    .byte   0x85
    .uleb128 0x2
    .byte   0x4
    .long   .LCFI7-.LCFI6
    .byte   0xd
    .uleb128 0x5
    .align 4
.LEFDE5:
    .ident  "GCC: (GNU) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)"
    .section    .note.GNU-stack,"",@progbits

এমনকি আরও কিছু ব্যতিক্রম হ্যান্ডলিং সারণী, এবং অতিরিক্ত তথ্য বিবিধ।

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

আপনি যদি আরও তথ্য চান, বিশেষত সমস্ত __cxa_ফাংশন কী করে, সেখান থেকে আসল স্পেসিফিকেশনটি দেখুন:


23
তাই সংক্ষিপ্তসার। কোনও ব্যতিক্রম ছুঁড়ে না দেওয়া হলে খরচ হয় না। ব্যতিক্রম ছুঁড়ে ফেলা হলে কিছু ব্যয় হয়, তবে প্রশ্নটি হয় 'ত্রুটি কোডগুলি ত্রুটি পরিচালনার কোডের সমস্ত পথে ব্যবহার এবং পরীক্ষার চেয়ে এই খরচটি কি বেশি'।
মার্টিন ইয়র্ক

5
ত্রুটির ব্যয় সম্ভবত প্রকৃতপক্ষে আরও বেশি। ব্যতিক্রম কোডটি সম্ভবত সম্ভবত ডিস্কে রয়েছে! যেহেতু ত্রুটি পরিচালনার কোডটি স্বাভাবিক কোড থেকে সরানো হয়, ত্রুটিবিহীন ক্ষেত্রে ক্যাশে আচরণ উন্নত করে।
এমসাল্টার

কিছু প্রসেসরের উপর, যেমন এআরএম, আটটি "অতিরিক্ত" বাইটস "ব্লা" এর আগে আটকে "[ব্রাঞ্চ-এবং-লিঙ্ক," কল "নামে পরিচিত]] নির্দেশনাটি ঠিক তত্ক্ষণাত ঠিকানায় ফিরে আসার মতো ব্যয় করতে হবে would "BL"। আমি আশ্চর্য হই যে কেবল "আগত ব্যতিক্রম" হ্যান্ডলারের ঠিকানার পরে প্রতিটি "ব্ল" থাকার দক্ষতা কীভাবে টেবিল-ভিত্তিক পদ্ধতির সাথে তুলনা করবে এবং কোনও সংকলক এই জাতীয় কাজ করে কিনা। আমি দেখতে পাচ্ছি সবচেয়ে বড় বিপদটি হ'ল অমিল কলিং কনভেনশনগুলি ন্যাক্কারজনক আচরণের কারণ হতে পারে।
সুপারক্যাট

2
@ সুপের্যাট: আপনি ব্যতিক্রম হ্যান্ডলিং কোডটি দিয়ে আপনার আই-ক্যাশে দূষিত করছেন। ব্যতিক্রম হ্যান্ডলিং কোড এবং টেবিলগুলি সর্বোপরি স্বাভাবিক কোড থেকে অনেক দূরে থাকে a
সিজারব

1
@ সিজারবি: প্রতিটি কল অনুসরণ করে একটি নির্দেশের শব্দ। খুব বেশি আপত্তিজনক বলে মনে হয় না, বিশেষত কেবলমাত্র "বাইরের" কোড ব্যবহার করে ব্যতিক্রম হ্যান্ডলিংয়ের কৌশলগুলির জন্য সাধারণত সেই কোডটি সর্বদা একটি বৈধ ফ্রেম পয়েন্টার বজায় রাখা প্রয়োজন (যা কিছু ক্ষেত্রে 0 অতিরিক্ত নির্দেশের প্রয়োজন হতে পারে, তবে অন্যদের ক্ষেত্রে এর চেয়ে বেশি প্রয়োজন হতে পারে এক).
সুপারক্যাট

13

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

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

কোনও ব্যতিক্রম ব্যবহার করা হচ্ছে না তখন ব্যতিক্রম হ্যান্ডলিং কোডের ব্যয়টি ব্যবহারিকভাবে শূন্য।

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

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

  • আপনার ব্যতিক্রম অতিরিক্ত জিনিস রাখবেন না।
  • কনস্ট্যান্ট রেফারেন্স দ্বারা ধরা।

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


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

@ স্পিডপ্লেন: আমি মনে করি কম্পাইলারগুলির পুরো বিন্দুটি যাতে আমাদের হার্ডওয়্যারটি বোঝার প্রয়োজন না হয় (এটি একটি বিমূর্ত স্তর সরবরাহ করে)। আধুনিক সংকলকগুলির সাথে আমি সন্দেহ করি যে আপনি যদি এমন একটি একক ব্যক্তি খুঁজে পেতে পারেন যিনি একটি আধুনিক সি ++ সংকলকটির প্রতিটি বিষয় বুঝতে পারেন। তাহলে জটিল বৈশিষ্ট্য এক্সকে বোঝার থেকে বোধগম্যতা কেন আলাদা
মার্টিন ইয়র্ক

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

@ স্পিডপ্লেন: তারপরে তাদের সি ব্যবহার করা উচিত যেখানে নকশার দ্বারা বিমূর্ত স্তরটি আরও পাতলা হয়।
মার্টিন ইয়র্ক

12

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

কোড প্রকল্পে বিশদ আলোচনা রয়েছে: একটি সি ++ সংকলক কীভাবে ব্যতিক্রম পরিচালনা পরিচালনা করে imple

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

একটি রিটার্ন কোড ব্যবহার করে কেবল একবারে স্ট্যাকের একক স্তরকে আনইন্ডাইন্ড করা যায়, অন্যদিকে মধ্যবর্তী স্ট্যাক ফ্রেমের মধ্যে কিছু করার জন্য যদি ব্যতিক্রম হ্যান্ডলিং মেকানিজমটি একটি অপারেশনে স্ট্যাকের নিচে আরও অনেক পিছনে লাফিয়ে উঠতে পারে।


"ব্যতিক্রমগুলির ওভারহেডটি ঘটে থাকে কারণ প্রতিটি স্ট্যাক ফ্রেমে কোন বস্তু ধ্বংস করতে হবে (বা আরও স্পষ্টভাবে স্কোপ) অবশ্যই ট্র্যাকার রাখতে কোড তৈরি করতে কোডটি তৈরি করতে হয়েছিল" "কম্পাইলারটি কি কোনও ফেরত থেকে অবজেক্টগুলি বিনষ্ট করার জন্য তা করতে পারে না?

না। রিটার্ন ঠিকানা এবং একটি টেবিল সহ একটি স্ট্যাক দেওয়া, সংকলক স্ট্যাকের মধ্যে কোন ফাংশন রয়েছে তা নির্ধারণ করতে পারে। এটি থেকে, কোন বস্তু অবশ্যই স্ট্যাকের মধ্যে ছিল। ব্যতিক্রম ছোঁড়ার পরে এটি করা যেতে পারে। কিছুটা ব্যয়বহুল, তবে কেবল তখনই প্রয়োজন যখন ব্যতিক্রম আসলে ছুঁড়ে দেওয়া হয়।
এমসাল্টার

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

6

ম্যাট পিট্রেইক উইন 32 স্ট্রাকচার্ড এক্সসেপশন হ্যান্ডলিংয়ের উপর একটি দুর্দান্ত নিবন্ধ লিখেছিলেন । এই নিবন্ধটি মূলত 1997 সালে রচিত হয়েছিল, এটি আজও প্রযোজ্য (তবে অবশ্যই উইন্ডোজে প্রযোজ্য)।


5

এই নিবন্ধটি ইস্যুটি পরীক্ষা করে এবং মূলত আবিষ্কার করে যে ব্যায়ামে ব্যতিক্রমগুলির জন্য রান-টাইম ব্যয় রয়েছে, যদিও ব্যতিক্রমটি ছুঁড়ে না দেওয়া হলে ব্যয়টি মোটামুটি কম। ভাল নিবন্ধ, প্রস্তাবিত।



0

সব ভাল উত্তর।

এছাড়াও, কোডটি ব্যতিক্রম নিক্ষেপ করার পরিবর্তে পদ্ধতির শীর্ষে গেট হিসাবে 'যদি চেক করা হয়' এমন কোডটি ডিবাগ করা কতটা সহজ এটি সম্পর্কেও ভাবেন think

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


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