পিএইচপি: ব্যতিক্রম ত্রুটি ব্যতিক্রম?


116

সম্ভবত আমি এটি পিএইচপি ম্যানুয়ালটিতে কোথাও মিস করছি তবে ত্রুটি এবং ব্যতিক্রমের মধ্যে পার্থক্যটি ঠিক কী? কেবলমাত্র তফাতটি আমি দেখতে পাচ্ছি যে ত্রুটিগুলি এবং ব্যতিক্রমগুলি আলাদাভাবে পরিচালনা করা হয়। তবে কী কারণে ব্যতিক্রম ঘটে এবং কোনটি ত্রুটির কারণ হয়?

উত্তর:


87

ব্যতিক্রম ছুঁড়ে দেওয়া হয় - তারা ধরা পড়ার উদ্দেশ্যে are ত্রুটিগুলি সাধারণত অপ্রাপ্তযোগ্য। উদাহরণস্বরূপ বলতে দিন - আপনার কোডের একটি ব্লক রয়েছে যা একটি ডাটাবেসে একটি সারি সন্নিবেশ করবে will সম্ভবত এই কলটি ব্যর্থ হয়েছে (সদৃশ আইডি) - আপনার একটি "ত্রুটি" থাকতে হবে যা এই ক্ষেত্রে একটি "ব্যতিক্রম" is আপনি যখন এই সারিগুলি serোকাচ্ছেন, আপনি এর মতো কিছু করতে পারেন

try {
  $row->insert();
  $inserted = true;
} catch (Exception $e) {
  echo "There was an error inserting the row - ".$e->getMessage();
  $inserted = false;
}

echo "Some more stuff";

প্রোগ্রামের প্রয়োগ কার্যকর হবে - কারণ আপনি ব্যতিক্রমটি 'ধরা' পেয়েছেন। ব্যতিক্রম ধরা না পড়লে ত্রুটি হিসাবে বিবেচিত হবে। এটি আপনাকে ব্যর্থ হওয়ার পরে প্রোগ্রামের সম্পাদনা চালিয়ে যাওয়ার অনুমতি দেবে।


29
Errors are generally unrecoverable<- আসলে এটি সত্য নয়। E_ERRORএবং E_PARSEদুটি সর্বাধিক প্রচলিত অপরিবর্তনযোগ্য ত্রুটি (অন্য কয়েকজন রয়েছে) তবে আপনি দেবদেবীতে যে ত্রুটিগুলি দেখবেন সেগুলির সিংহভাগ পুনরুদ্ধারযোগ্য ( E_NOTICE, E_WARNINGইত্যাদি)। দুর্ভাগ্যক্রমে পিএইচপি এর ত্রুটি পরিচালনার একটি সম্পূর্ণ জগাখিচুড়ি - সব ধরণের জিনিস অকারণে ত্রুটিগুলি ট্রিগার করে (উদাহরণস্বরূপ, ফাইল সিস্টেমের বেশিরভাগ কার্যকারিতা)। সাধারণ ব্যতিক্রমগুলি
হ'ল "ওওপ

1
@ ডেভর্যান্ডম ই_নোটাইস, ই_ওয়ার্নিং সংজ্ঞা দ্বারা "ত্রুটি" নয় তারা কি? আমি সবসময় তাদেরকে 'বার্তা' হিসাবে ভাবতাম যে পিএইচপি প্রোগ্রামারকে অবহিত করতে প্রদর্শন করে যে কোড / সে লিখেছিল তাতে কিছু ভুল হতে পারে।
slhsen

2
@ স্লহসেন ইস্যুটি সত্যই কৃপণ পরিভাষা, এই বার্তাগুলির সমস্ত ফর্ম পিএইচপি-র "ত্রুটি হ্যান্ডলিং সিস্টেম" এর মধ্য দিয়ে যায়, শব্দার্থগতভাবে নোটিশ / সতর্কতা অবশ্যই "হিসাবে একই নয়" ত্রুটি "যে প্রসঙ্গে। ধন্যবাদ, আসন্ন পিএইচপি 7 কমপক্ষে এই জিনিসগুলিকে ক্যাচবল ব্যতিক্রমগুলিতে পরিণত করার মাধ্যমে (একটি নতুন Throwableইন্টারফেসের মাধ্যমে) কমপক্ষে এই গণ্ডগোল বাছাইয়ের পথটি কমপক্ষে প্রশস্ত করেছে, উভয়কে বাস্তবের জন্য আলাদাভাবে এবং যথাযথভাবে হস্তান্তর করার জন্য আরও স্পষ্ট করে তুলেছে সমস্যা এবং পরামর্শমূলক বার্তা
DaveRandom

"প্রোগ্রাম কার্যকর করা চালিয়ে যাবে" পরিবর্তন কি আমি মনে করি? যেহেতু পিএইচপি বলছে "যখন কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয়, তখন বিবৃতি অনুসরণের কোডটি কার্যকর করা হবে না" ( php.net/manual/en/language.exception.php )
রবার্ট সিনক্লেয়ার

1
আমি মনে করি ওপি বলতে যা বোঝায় তা Errorভিএস এর বংশধরদের মধ্যে পার্থক্য সম্পর্কে আরও ছিল Exception
Xedin অজ্ঞাত

55

আমি সাধারণত set_error_handlerএমন একটি ফাংশনে যা ত্রুটিটি নিয়ে যায় এবং একটি ব্যতিক্রম ছুঁড়ে ফেলি যাতে যা ঘটে যাই তা মোকাবেলা করার জন্য কেবল ব্যতিক্রম থাকি । আর কোনও @file_get_contentsসুন্দর এবং ঝরঝরে চেষ্টা / ধরা নেই।

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

সম্পাদনা:

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

<?php

define( 'DEBUG', true );

class ErrorOrWarningException extends Exception
{
    protected $_Context = null;
    public function getContext()
    {
        return $this->_Context;
    }
    public function setContext( $value )
    {
        $this->_Context = $value;
    }

    public function __construct( $code, $message, $file, $line, $context )
    {
        parent::__construct( $message, $code );

        $this->file = $file;
        $this->line = $line;
        $this->setContext( $context );
    }
}

/**
 * Inspire to write perfect code. everything is an exception, even minor warnings.
 **/
function error_to_exception( $code, $message, $file, $line, $context )
{
    throw new ErrorOrWarningException( $code, $message, $file, $line, $context );
}
set_error_handler( 'error_to_exception' );

function global_exception_handler( $ex )
{
    ob_start();
    dump_exception( $ex );
    $dump = ob_get_clean();
    // send email of dump to administrator?...

    // if we are in debug mode we are allowed to dump exceptions to the browser.
    if ( defined( 'DEBUG' ) && DEBUG == true )
    {
        echo $dump;
    }
    else // if we are in production we give our visitor a nice message without all the details.
    {
        echo file_get_contents( 'static/errors/fatalexception.html' );
    }
    exit;
}

function dump_exception( Exception $ex )
{
    $file = $ex->getFile();
    $line = $ex->getLine();

    if ( file_exists( $file ) )
    {
        $lines = file( $file );
    }

?><html>
    <head>
        <title><?= $ex->getMessage(); ?></title>
        <style type="text/css">
            body {
                width : 800px;
                margin : auto;
            }

            ul.code {
                border : inset 1px;
            }
            ul.code li {
                white-space: pre ;
                list-style-type : none;
                font-family : monospace;
            }
            ul.code li.line {
                color : red;
            }

            table.trace {
                width : 100%;
                border-collapse : collapse;
                border : solid 1px black;
            }
            table.thead tr {
                background : rgb(240,240,240);
            }
            table.trace tr.odd {
                background : white;
            }
            table.trace tr.even {
                background : rgb(250,250,250);
            }
            table.trace td {
                padding : 2px 4px 2px 4px;
            }
        </style>
    </head>
    <body>
        <h1>Uncaught <?= get_class( $ex ); ?></h1>
        <h2><?= $ex->getMessage(); ?></h2>
        <p>
            An uncaught <?= get_class( $ex ); ?> was thrown on line <?= $line; ?> of file <?= basename( $file ); ?> that prevented further execution of this request.
        </p>
        <h2>Where it happened:</h2>
        <? if ( isset($lines) ) : ?>
        <code><?= $file; ?></code>
        <ul class="code">
            <? for( $i = $line - 3; $i < $line + 3; $i ++ ) : ?>
                <? if ( $i > 0 && $i < count( $lines ) ) : ?>
                    <? if ( $i == $line-1 ) : ?>
                        <li class="line"><?= str_replace( "\n", "", $lines[$i] ); ?></li>
                    <? else : ?>
                        <li><?= str_replace( "\n", "", $lines[$i] ); ?></li>
                    <? endif; ?>
                <? endif; ?>
            <? endfor; ?>
        </ul>
        <? endif; ?>

        <? if ( is_array( $ex->getTrace() ) ) : ?>
        <h2>Stack trace:</h2>
            <table class="trace">
                <thead>
                    <tr>
                        <td>File</td>
                        <td>Line</td>
                        <td>Class</td>
                        <td>Function</td>
                        <td>Arguments</td>
                    </tr>
                </thead>
                <tbody>
                <? foreach ( $ex->getTrace() as $i => $trace ) : ?>
                    <tr class="<?= $i % 2 == 0 ? 'even' : 'odd'; ?>">
                        <td><?= isset($trace[ 'file' ]) ? basename($trace[ 'file' ]) : ''; ?></td>
                        <td><?= isset($trace[ 'line' ]) ? $trace[ 'line' ] : ''; ?></td>
                        <td><?= isset($trace[ 'class' ]) ? $trace[ 'class' ] : ''; ?></td>
                        <td><?= isset($trace[ 'function' ]) ? $trace[ 'function' ] : ''; ?></td>
                        <td>
                            <? if( isset($trace[ 'args' ]) ) : ?>
                                <? foreach ( $trace[ 'args' ] as $i => $arg ) : ?>
                                    <span title="<?= var_export( $arg, true ); ?>"><?= gettype( $arg ); ?></span>
                                    <?= $i < count( $trace['args'] ) -1 ? ',' : ''; ?> 
                                <? endforeach; ?>
                            <? else : ?>
                            NULL
                            <? endif; ?>
                        </td>
                    </tr>
                <? endforeach;?>
                </tbody>
            </table>
        <? else : ?>
            <pre><?= $ex->getTraceAsString(); ?></pre>
        <? endif; ?>
    </body>
</html><? // back in php
}
set_exception_handler( 'global_exception_handler' );

class X
{
    function __construct()
    {
        trigger_error( 'Whoops!', E_USER_NOTICE );      
    }
}

$x = new X();

throw new Exception( 'Execution will never get here' );

?>

এটা সহায়ক হবে। আমি পিএইচপি মোকাবিলার জন্য যে সময়টি তৈরি করেছি তা স্বাচ্ছন্দ্যের কিছু সাহায্য করবে। :-)
জেসন বেকার

সুন্দর কোড, ধন্যবাদ। দশম শ্রেণিটি কোথা থেকে আসে আমি পাই না এবং এর উদ্দেশ্য কী?
আলেক

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

স্ট্যান্ডার্ড পিএইচপি একটি সাধারণ ত্রুটি হ্যান্ডলার থেকে বিশেষত নিক্ষেপ করার জন্য ত্রুটি-ধারণাটি সংজ্ঞায়িত করে। আপনি কি আমাকে আপনার পোস্ট সম্পাদনা এবং আপডেট করার অনুমতি দেবেন?
টিবেরিউ-আয়নু স্টান

@ টিবেরিউ-আয়নুস্ট্যান: নিশ্চিত, তবে কাজের উদাহরণটি সমন্বয়ের বাইরে থাকবে। এছাড়াও, আজকাল আমি সম্ভবত এর পরিবর্তে বেসরকারি- com.com থেকে github.com/theredhead/red.web/blob/master/src/lib/bootstrap.php সম্পর্কে লোকদের নির্দেশ করব
ক্রিস

21

উত্তরটি ঘরে হাতির কথা বলার যোগ্য

ত্রুটিগুলি রান-টাইমে ত্রুটি শর্তটি পরিচালনা করার পুরানো উপায়। সাধারণত কোডটি set_error_handlerকিছু কোড চালানোর আগে যেমন কিছু কল করত । সমাবেশ ভাষা বাধা ofতিহ্য অনুসরণ করে। কিছু বেসিক কোড দেখতে কেমন হবে তা এখানে।

on error :divide_error

print 1/0
print "this won't print"

:divide_error

if errcode = X
   print "divide by zero error"

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

try {
   print 1/0;
   print "this won't print";
} catch (DivideByZeroException $e) {
   print "divide by zero error";
}

কোনও ভুল ত্রুটি হ্যান্ডলারকে কল করার কোনও আলাদা কার্য বা ঝুঁকি নেই। কোডটি এখন একই জায়গায় থাকার গ্যারান্টিযুক্ত। এছাড়াও আমরা আরও ভাল ত্রুটির বার্তা পাই।

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

চূড়ান্ত উত্তর

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


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

1
এটি আমার মতে সেরা উত্তর, কারণ এটি সর্বাধিক বিস্তারিত এবং ব্যাখ্যামূলক।
রবার্ট কুজনিয়ার

8

এখানে যুক্ত করার একটি বিষয় ব্যতিক্রম এবং ত্রুটিগুলি পরিচালনা করা। অ্যাপ্লিকেশন বিকাশকারীটির উদ্দেশ্যে, ত্রুটি এবং ব্যতিক্রম উভয়ই হ'ল "খারাপ জিনিস" যা আপনার অ্যাপ্লিকেশনটিতে যে সমস্যা রয়েছে সেগুলি সম্পর্কে জানতে আপনি রেকর্ড করতে চান - যাতে আপনার গ্রাহকদের দীর্ঘ সময়ের জন্য আরও ভাল অভিজ্ঞতা থাকতে পারে।

সুতরাং কোনও ত্রুটি হ্যান্ডলার লিখলে তা বোঝা যায় যা ব্যতিক্রমগুলির জন্য আপনি যা করেন ঠিক একই কাজ করে।


লিঙ্ক সরবরাহ করার জন্য ধন্যবাদ!
মাইক মুর

@ অ্যালেক্স ওয়েইনস্টাইন: লিঙ্কটি নষ্ট হয়েছে
মার্কো ডেমাইও

7

অন্যান্য উত্তরে যেমন বলা হয়েছে, ব্যতিক্রম থ্রোয়ারে ত্রুটি হ্যান্ডলার সেট করা PHP এর ত্রুটিগুলি পরিচালনা করার সেরা উপায়। আমি কিছুটা সহজ সেটআপ ব্যবহার করি:

set_error_handler(function ($errno, $errstr, $errfile, $errline ) {
        if (error_reporting()) {
                throw new \ErrorException($errstr, 0, $errno, $errfile, $errline);
        }
});

অপারেটরকে কাজ করার error_reporting()জন্য দয়া করে চেকটি নোট করুন @। এছাড়াও, কাস্টম ব্যতিক্রম সংজ্ঞায়িত করার প্রয়োজন নেই, পিএইচপি এর জন্য একটি দুর্দান্ত ক্লাস রয়েছে।

ব্যতিক্রম ছোঁড়ার দুর্দান্ত সুবিধা হ'ল ব্যতিক্রমগুলি তাদের সাথে স্ট্যাক ট্রেস যুক্ত করে, তাই সমস্যাটি কোথায় তা খুঁজে পাওয়া সহজ।


5

পুনরায়: "তবে ত্রুটি এবং ব্যতিক্রমের মধ্যে পার্থক্য কী?"

পার্থক্য সম্পর্কে এখানে অনেক ভাল উত্তর আছে। আমি কেবল এমন কিছুতে যুক্ত করব যা সম্পর্কে এখনও কথা হয়নি - পারফরম্যান্স। বিশেষত, এটি ব্যতিক্রম ছোঁড়া / পরিচালনা এবং একটি রিটার্ন কোড হ্যান্ডেল (সাফল্য বা কিছু ত্রুটি) এর মধ্যে পার্থক্যের জন্য। সাধারণত, পিএইচপি-তে, এর অর্থ ফেরত দেওয়া falseবা null, তবে সেগুলি আরও বেশি বিস্তারিত হতে পারে যেমন ফাইল আপলোড করার সাথে: http://php.net/manual/en/features.file-upload.erferences.php আপনি এমনকি কোনও ব্যতিক্রম বস্তুও ফিরে আসতে পারেন !

আমি বিভিন্ন ভাষা / সিস্টেমে কয়েকটি পারফরম্যান্স রান করেছি। সাধারণভাবে বলতে গেলে, ব্যতিক্রমী হ্যান্ডলিং ত্রুটি রিটার্ন কোডের জন্য যাচাই করা প্রায় 10,000x ধীর।

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

সম্পাদনা:

পিএইচপি ব্যতিক্রম হ্যান্ডলিংয়ের জন্য অত্যন্ত অনুকূলিত। রিয়েল ওয়ার্ল্ড টেস্টগুলি দেখায় যে একটি ব্যতিক্রম নিক্ষেপ করা কোনও মান ফেরানোর চেয়ে 2-10x ধীর is


3
অবশ্যই, তবে ব্যতিক্রমগুলি ছুঁড়ে ফেলতে যত পরিমাণ চক্র হারিয়েছে তা ব্যতিক্রমগুলির সাথে আপনি যে অতিরিক্ত বর্ণনামূলক ক্ষমতা পেয়েছেন তার চেয়ে বেশি। আপনি নির্দিষ্ট ধরণের ব্যতিক্রম নিক্ষেপ করতে পারেন, এমনকি ত্রুটি কোডগুলি ধারণ করতে ব্যতিক্রমটিতে ডেটা যুক্ত করতে পারেন। আমি আপনার 10,000 * দাবীও গুরুতরভাবে সন্দেহ করি। আপনি যদি সময়ের পার্থক্য সম্পর্কে ঠিক থাকেন তবে রিটার্ন করতে ব্যয় করা সময় এবং যদি বনাম নতুন এক্সিকিউশন, নিক্ষেপ করা, কোনও বাস্তব বিশ্বের দৃশ্যে ধরা কার্যকরভাবে সম্পাদিত কোডের তুলনায় এতটা বিয়োগাত্মক যে এটি অবশ্যই একটি অকাল অপটিমাইজেশন। ব্যতিক্রম নিক্ষেপ করুন, 90% সময়ের সাথে ডিল করার জন্য তারা ভাল।
gnarf 2'12

1
1. 10,000x সঠিক - ভাষা এবং সংকলক বিকল্পগুলির উপর ভিত্তি করে কিছু বৈকল্পিকের সাথে। ২. আপনাকে নাল / মিথ্যা ফিরতে হবে না। আপনি এখন পর্যন্ত একটি নম্বর - MAX_ULONG রিটার্ন কোড পর্যন্ত ফিরিয়ে দিতে পারবেন। আপনি বিকল্পভাবে একটি ব্যর্থ স্ট্রিং ফিরে আসতে পারেন এবং কেবল একটি সাফল্যের স্ট্রিং বা int বা নাল পরীক্ষা করে দেখতে পারেন। ৩. বাস্তব বিশ্বের পরিস্থিতিতে প্রতিটি ঘড়ির চক্র গণনা করা হয়। ফেসবুকের দৈনিক সক্রিয় ব্যবহারকারীদের সংখ্যা 552 মিলিয়ন। ধরে নিচ্ছি ব্যতিক্রমগুলি কেবল 2x এবং যাচাই করা ব্যবহারকারী / পাসের জন্য .001s লাগে যা প্রতিদিন 153 ঘন্টা প্রক্রিয়াকরণের সময় সাশ্রয় করে। 10,000x এ এটি 175 বছর সাশ্রয় করে। লগইন প্রচেষ্টা পরীক্ষা করার জন্য - প্রতিটি দিন।
ইভান

: @evan: অবগতির জন্য, এখানে তারা কোড ব্যতিক্রম সাথে পরীক্ষিত এবং এটি ধীর হতে বলে মনে হচ্ছে না stackoverflow.com/a/445094/260080
মার্কো Demaio

@ মার্কোডেমিও এই প্রশ্নটি ব্যাতিক্রম ছাড়াই চেষ্টা / ক্যাপ ব্লককে আচ্ছাদন করে। আরও ভাল পরীক্ষা হ'ল মান () বাদ দিয়ে একটি মান ফেরত দেওয়া এবং () ব্যতীত একটি ব্যতিক্রম নিক্ষেপ করা। এছাড়াও, এটি একাধিক ফাংশনের মাধ্যমে বুদবুদ হওয়া উচিত। stackoverflow.com/a/104375/505172 বলেছেন যে পিএইচপি-র মধ্যে পার্থক্যটি আসলে 54x। আমি রিয়েল টাইমটি দেখে নিজের পরীক্ষা চালিয়েছি এবং এটি 2-10x ধীর বলে মনে হচ্ছে। এটি প্রত্যাশার চেয়ে সব দিক থেকে ভাল।
ইভান

@ ইভান: আমি তখন উদ্বিগ্ন হব না, আমি কেবল অপ্রত্যাশিত / অপরিবর্তনযোগ্য ত্রুটিগুলি ট্র্যাক করতে ব্যতিক্রমগুলি ব্যবহার করি তাই এটি যদি আমার 100% গতি কমও হয় তবে আমি চিন্তা করি না। আমার উদ্বেগগুলি কেবল চেষ্টা / ধরার ব্লকগুলি যুক্ত করে কোডটিকে ধীর করে দেওয়ার বিষয়ে ছিল।
মার্কো ডেমাইও

4

আমার মনে হয় আপনি যে আঞ্জারটি সন্ধান করছেন তা হ'ল এটি;

ত্রুটিগুলি হ'ল স্ট্যান্ডার্ড স্টাফ যা আপনি ব্যবহার করেন যেমন একটি $ ভেরিয়েবলের উপস্থিতি নেই e
ব্যতিক্রমগুলি কেবল পিএইচপি 5 এর পরে এবং অবজেক্টগুলির সাথে ডিল করার সময় আসে come

এটি সহজ রাখতে:

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

যদি আপনি একটি ব্যতিক্রম "ধরা" না পান তবে এটি একটি স্ট্যান্ডার্ড ত্রুটিতে পরিণত হয়।

ত্রুটিগুলি হ'ল পিএইচপি তহবিল ত্রুটি যা সাধারণত আপনার স্ক্রিপ্টটি থামায়।

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

আশা করি এইটি কাজ করবে


3
ব্যতিক্রমগুলি পিএইচপি-তে পদ্ধতিগত কোডের পাশাপাশি ব্যবহার করা যেতে পারে।
টিবেরিউ-আয়নু স্টান

2

পিএইচপি 7.1 এবং তারপরে, একটি ক্যাচ ব্লক পাইপ (|) অক্ষর ব্যবহার করে একাধিক ব্যতিক্রম নির্দিষ্ট করতে পারে। যখন বিভিন্ন শ্রেণীর শ্রেণিবিন্যাসের বিভিন্ন ব্যতিক্রমগুলি একইভাবে পরিচালিত হয় তখন এটি কার্যকর।

try {
  // do something
} catch (Error | Exception $e) {
  echo $e->getMessage();
}

1

ব্যতিক্রমগুলি কোডের মাধ্যমে একটি থ্রো, ত্রুটিগুলি ... এত বেশি ব্যবহার করে ইচ্ছাকৃতভাবে ছুঁড়ে দেওয়া হয়।

ত্রুটিগুলি এমন কোনও কিছুর ফলস্বরূপ ঘটে যা সাধারণত পরিচালনা করা হয় না। (আইও ত্রুটি, টিসিপি / আইপি ত্রুটি, নাল রেফারেন্স ত্রুটি)


1
এটি অগত্যা সত্য নয়। অনেক ক্ষেত্রে ত্রুটিগুলি পরীক্ষা করা হয় এবং রিটার্ন কোডগুলি ইচ্ছাকৃতভাবে যথাযথ হিসাবে ফেরত পাঠানো হয়। আসলে, প্রতিটি অ-অবজেক্ট ওরিয়েন্টেড ভাষার ক্ষেত্রে এটিই। ব্যতিক্রমগুলি কেবল এটিই, নিয়মের ব্যতিক্রমও। উভয় ক্ষেত্রেই, কিছু ভুল হয়েছে, লক্ষ্য করা গেছে, এবং এটি পরিচালনা করা উচিত। পিএইচপি ফাইল আপলোড আগমন কোড মাধ্যমে ইচ্ছাকৃত ত্রুটি পরিচালনা একটি উদাহরণ হয় - php.net/manual/en/features.file-upload.errors.php
ইভান

1

আমি আপনাকে ত্রুটি নিয়ন্ত্রণের একটি সবচেয়ে অস্বাভাবিক আলোচনা দেওয়ার ইচ্ছা করি।

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

ত্রুটি প্রসেসিংয়ের জন্য কভারগুলির মধ্যে প্রথম যেটি ঘটে তা হ'ল এক প্রোগ্রামের স্টেট থেকে অন্য প্রোগ্রামে ঝাঁপিয়ে পড়ে। কীভাবে হয়? আমি এটি পেতে হবে।

.তিহাসিকভাবে, ত্রুটিগুলি পুরানো এবং সহজ এবং ব্যতিক্রমগুলি আরও নতুন এবং আরও জটিল এবং সক্ষম। ত্রুটিগুলি ঠিক ততক্ষণ কাজ করে যতক্ষণ না আপনি এগুলি বুদবুদ করেন, এটি আপনার সুপারভাইজারের কাছে একটি কঠিন সমস্যা হস্তান্তর সমতুল্য।

ত্রুটিগুলি ত্রুটি সংখ্যাগুলির মতো সংখ্যা এবং কখনও কখনও এক বা একাধিক যুক্ত স্ট্রিংগুলির সাথেও হতে পারে। উদাহরণস্বরূপ, যদি কোনও ফাইল-পঠন ত্রুটি দেখা দেয় তবে আপনি এটি কী হতে পারে তা সম্ভবত রিপোর্ট করতে সক্ষম হন এবং সম্ভবত নিখুঁতভাবে ব্যর্থ হন। (হেই, এটি পুরানো দিনের মতো ক্র্যাশ হওয়া থেকে এক ধাপ up

ব্যতিক্রম সম্পর্কে প্রায়শই যা বলা হয় না তা হ'ল ব্যতিক্রমগুলি একটি বিশেষ ব্যতিক্রম স্ট্যাকের উপর স্তরযুক্ত বস্তু la এটি প্রোগ্রামের প্রবাহের জন্য একটি রিটার্ন স্ট্যাকের মতো, তবে এটি কেবল ত্রুটি চেষ্টা ও ক্যাচের জন্য একটি রিটার্ন স্টেট ধরে। (আমি তাদের ePush এবং ePop বলতাম, এবং? Abort ছিল শর্তসাপেক্ষ নিক্ষেপ যা ইপপ হবে এবং সেই স্তরে ফিরে আসবে, যদিও অ্যাবার্ট পুরো মারা যাবেন বা প্রস্থান করতেন))

স্ট্যাকের নীচে প্রাথমিক কলার সম্পর্কিত তথ্য রয়েছে, যখন বাহ্যিক চেষ্টা শুরু হয়েছিল তখন যে অবস্থাটি রাষ্ট্র সম্পর্কে জানে সেই অবজেক্টটি যা আপনার প্রোগ্রাম শুরু হওয়ার সময় প্রায়শই ঘটে। উপরের অংশে বা স্ট্যাকের পরবর্তী স্তরটিতে বাচ্চা হওয়া এবং পিতা-মাতার নীচে থাকা পরবর্তী অভ্যন্তরীণ চেষ্টা / ক্যাপ ব্লকের ব্যতিক্রম বিষয় object

আপনি যদি চেষ্টা করে দেখতে চেষ্টা করেন তবে আপনি আভ্যন্তরীণ চেষ্টাটি বহিরাগত চেষ্টাটির উপরে রেখে দিচ্ছেন। যখন অভ্যন্তরীণ চেষ্টাতে ত্রুটি দেখা দেয় এবং হয় অভ্যন্তরীণ ক্যাচটি এটি পরিচালনা করতে পারে না বা ত্রুটিটি বাইরের চেষ্টাতে ফেলে দেওয়া হয়, তবে এটির ত্রুটিটি পরিচালনা করতে পারে কিনা তা নিয়ন্ত্রণ করার জন্য নিয়ন্ত্রণটি বাইরের ক্যাচ ব্লক (অবজেক্ট) এ পৌঁছে দেওয়া হয়, অর্থাৎ আপনার সুপারভাইজার

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

সুতরাং একটি চেষ্টা / ক্যাচ ব্লক সাজানোর একটি পরিস্থিতি সেট করে যাতে অন্য সমস্ত গোলমাল হয়ে যায় তবে ফিরে আসতে সক্ষম হবে। এটি পিতামাতার মতো। যখন আমাদের জীবন বিভ্রান্ত হয় তখন আমরা আমাদের পিতামাতার কোলে ফিরে যেতে পারি এবং তারা এগুলি আবার ঠিক করে দেবে।

আশা করি আমি তোমাকে হতাশ করিনি।


1

আপনি এই মন্তব্য যোগ করতে পারেন

function doSomething()
{
   /** @noinspection PhpUnhandledExceptionInspection */
   throw new Exception();
}

0

একবার সেট_অরর_হ্যান্ডলার () সংজ্ঞায়িত হয়ে গেলে ত্রুটি হ্যান্ডলারটি ব্যতিক্রমের মতো similar নীচে কোড দেখুন:

 <?php
 function handleErrors( $e_code ) {
   echo "error code: " . $e_code . "<br>";
 }

 set_error_handler( "handleErrors" ); 

 trigger_error( "trigger a fatal error", E_USER_ERROR);
 echo "after error."; //it would run if set_error_handler is defined, otherwise, it wouldn't show
?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.