পিএইচপি-তে ব্লকটি চেষ্টা করুন / ব্যতিক্রম ধরা পড়েনি


100

আমি এই পৃষ্ঠাটি থেকে এই উদাহরণটি # 1 চালানোর চেষ্টা করছি: http://php.net/manual/en/language.exferences.php

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    return 1/$x;
}
try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
// Continue execution
echo "Hello World\n";
?>

তবে পছন্দসই আউটপুটটির পরিবর্তে আমি পাই:

0.2
Fatal error: Uncaught exception 'Exception' with message 'Division by zero.' 
in xxx:
7 Stack trace: #0 xxx(14): inverse(0) #1 {main} thrown in xxx on line 7

ডেভেলপার পরিবেশ আমি ব্যবহার করছি হয় UniServer 3.5সঙ্গেPHP 5.2.3


4
আপনি কি আমাদের আপনার কোড প্রদর্শন করতে পারেন? এই ত্রুটিটি পেতে আপনি যে ভুলটি করতে পারেন তা হ'ল ভুল ব্যতিক্রম (বা কোনওটিই নয়) ধরা।
তম্মো

4
কোডটি হুবহু অভিন্ন (আমি সবেমাত্র কিছু নতুন লাইন যুক্ত করেছি) ... যাইহোক, আমি কোডটি আবার একবার একটি পরীক্ষার ফাইলে অনুলিপি করেছিলাম এবং এখানে একই ত্রুটি বার্তাটি পাওয়া যায়: 0.2 মারাত্মক ত্রুটি: শূন্য দ্বারা বিভাগ 'বিভাগ ব্যতীত' ব্যতিক্রম 'বার্তাটি ছাড়াই ' ডাব্লু: \ www \ test.php: 4 স্ট্যাক ট্রেস: # 0 ডাব্লু: \ www \ test.php (11): বিপরীতমুখী (0) # 1 {প্রধান W ডাব্লু: \ www \ test.php নং 4 এ নিক্ষিপ্ত আমি সত্যিই কোন ধারণা নেই সেখানে কি ঘটছে ... সম্ভবত ত্রুটিযুক্ত পিএইচপি কনফিগারেশন?
ক্র্যাসি

4
কিছু পুরানো এক্সটেনশন সংস্করণ ব্যতিক্রম হ্যান্ডলিংয়ে সমস্যা সৃষ্টি করেছে। 5.2.3 পুরানো এবং ত্রুটির পিছনে একটি বাগ থাকতে পারে। আপনি কি পিএইচপি আপগ্রেড করতে পারেন? ইউনিক্সবার ৩.৩ বর্তমান সংস্করণ 5.5 হিসাবে বিবেচনা করেও বেশ পুরানো। 3.5 কি টাইপো?
23'9

4
ইউনিক্সবার রিলিজ তথ্য ( উইকি.উনিফর্মসার্ভার.com / index.php/… ) এর দিকে তাকিয়ে , 3.5 স্পষ্টতই টাইপো নয়। ইউনিক্সবার 5.5-এ আপগ্রেড করুন এবং আবার নমুনা কোডটি চেষ্টা করুন।
outis

4
আউটস, টিপ জন্য ধন্যবাদ :)। আমি এটি তখনই করেছি - এক্সএএমপিপি-তে স্যুইচ করেছি (ইউনিসर्ভারের নতুন সংস্করণটির মতো না)। 3.5 টি টাইপো নয়, তবে সার্ভারটি আমার জন্য পুরোপুরি কাজ করেছে তাই আমি কখনই এটি আপগ্রেড করার চিন্তা করি না।
ক্র্যাসি

উত্তর:


222

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

আমি আমার নামস্থান নামক আমার ব্যতিক্রম ছিল একটি স্ক্রিপ্ট একটি নামস্থান নামক ছিল বি । সমস্যাটি হ'ল আমার কাছে একটি \ MyException ছিল যা সমান (পিএইচপি তে) \ বি \ এ \ মাই এক্সসেপশন (কারণ আমার স্ক্রিপ্টটি বি নামে পরিচিত স্থানটিতে রয়েছে !)। এটি ঠিক করার জন্য আমাকে যা করতে হয়েছিল তা হল ব্যাক স্ল্যাশ (বা এটি যাকেই বলা হোক না কেন) ব্যতিক্রম নামটি যুক্ত করা যাতে এটি দেখতে এটির মতো দেখাবে: \ A \ MyException


7
এই পোস্ট করার জন্য আপনাকে অনেক ধন্যবাদ কারণ আমি আমার ভুল বুঝতে না পেরে বেশ কয়েকদিন যেতে পারতাম।
টিপু

82
এটি আমার সমস্যার সমাধান করেছে, নেমস্পিড কোডটিতে একটি সহজ অলস ক্যাচ ব্লক হওয়া উচিত catch (\Exception $e)। ব্যাকস্ল্যাশ ছাড়া নাম স্পেস Exceptionনির্দিষ্ট এবং এটি মিলবে না (বা ধরা পড়ে না)।
jomaller

4
এই পোস্ট করার জন্য ধন্যবাদ!
কিপকিমি

4
এটি পোস্ট করার জন্য আপনাকে ধন্যবাদ, আমি আমার ক্যাচ ব্লকটি কেন কাজ করছে না তা নিয়ে পাগল হয়ে শেষ কয়েক ঘন্টা ব্যয় করেছি। মেজর ফেসপাম।
মিচ 23

4
চিয়ার্স! আমার দিন বাঁচিয়েছে (এবং নিউরন ...) :)
শাকসবজি

68

বেশ পুরানো প্রশ্ন, এখনও ...

আমারও এই সমস্যাটি ছিল (এবং আমি এই পোস্টটি কীভাবে খুঁজে পেয়েছি) তবে কেবল সহজ পরীক্ষা-নিরীক্ষার ফলে সমাধানটি সন্ধান করার অনুমতি পেয়েছি। কেবল পরিবর্তিত Exceptionকরার চেষ্টা করুন \Exception। আমার জন্য কাজ!

সম্পাদনা:

সিভান মন্তব্যে উল্লেখ করেছেন যে, নেমস্পেস ব্যবহার করা একই জিনিস করা উচিত। সুতরাং সহজভাবে use \Exception as Exception;আপনার শ্রেণীর ঘোষণার আগে রাখুন।


উজ্জ্বল! :) সম্ভবত আমাকে কয়েক ঘন্টা সময় বের করতে হবে, কেবল নেমস্পেসিংয়ের কথা ভাবেনি। ধন্যবাদ!
আলেকজান্ডার গিলমানভ

হ্যাঁ! এছাড়াও: "ব্যবহার Ex ব্যতিক্রম হিসাবে ব্যতিক্রম;" শীর্ষে একই জিনিস করে।
সিভান

@ সিআই-অনিক যেমন শিবান লিখেছেন ঠিক তেমনই নেমস্পেস ব্যবহার করার চেষ্টা করুন।
এনিথিয়ন

শুধু এটি করা use Exception;উচিত
ডিয়েগো পনসিয়ানো

33

catch(\Exception $e)পরিবর্তে রাখার চেষ্টা করুন catch(Exception $e)। আপনি যদি এমন কোনও কোড ব্যবহার করছেন যা আপনি খুব ভাল জানেন না, বা - বিশেষত - আপনি যদি কোনও ফ্রেমওয়ার্ক ব্যবহার করেন তবে এটি ডিফল্ট পিএইচপি ব্যতিক্রম তার নিজস্ব কোনওটির সাথে ওভাররাইড করতে পারে এবং তাই আপনি ভুল পথে যেতে পারেন এবং পেতে পারেন অনাকাঙ্ক্ষিত ফলাফল। আপনি যদি স্রেফ রাখেন \Exceptionতবে আপনি নিশ্চিত যে আপনি বেস পিএইচপি ব্যতিক্রমটি ধরছেন।


@ ক্র্যাসি, আপনি কি আমার পরামর্শটি চেষ্টা করেছিলেন?
ভ্লাদিমির দেশপোটোভিচ

4
এটি আমার জন্য তা করেছে
cljk

আমি সিআই 4 এ কাজ করছি এবং এটি আমার পক্ষে কাজ করেছে।
আদনান আহমেদ

20

আপনি পিএইচপি-তে সাধারণ চেষ্টা another} ক্যাচ {} ব্লক ব্যবহার করতে পারবেন না যেমন আপনি সি # (সিশার্প) এর মতো অন্য ভাষায় করতে পারেন।

আপনি যদি এটি করেন:

try{
    //division by zero
    $number = 5/0;
}
catch(Exception $ex){
    echo 'Got it!';
}

আপনি 'বুঝতে পারছেন না!' বার্তা না। কেন? এটি কেবল কারণ পিএইচপি সর্বদা "নিক্ষিপ্ত" হওয়ার জন্য একটি ব্যতিক্রম দরকার। আপনার নিজের ত্রুটি হ্যান্ডলারটি সেট করতে হবে এবং এটির সাথে একটি ব্যতিক্রম ছুঁড়ে ফেলতে হবে।

Set_error_handler ফাংশনটি দেখুন : http://php.net/manual/es/function.set-error-handler.php


6
এটি একই নয়;) আপনার নিজের দ্বারা একটি ব্যতিক্রম ছোঁড়ার দরকার ছিল এবং আমি এটি বলেছিলাম (<< এটি কেবল কারণ পিএইচপি সর্বদা "নিক্ষিপ্ত" হওয়ার জন্য একটি ব্যতিক্রম প্রয়োজন >>) @ জ্যারেডফারিশ
রওইনসন গ্যাল্লেগো

হ্যাঁ, তবে এটি কীভাবে এক নয়?
জারেড ফারিশ

এই লিঙ্কটি মারা গেছে, তবে আমি এটি দরকারী পেয়েছি: w3schools.com/php/func_error_set_error_handler.asp
লোডিং

পিএইচপি সংস্করণ 7.3.9 এ $number = 5/0;কোনও ব্যতিক্রম বাড়াবে না। $numberসেট করা আছে INF
ভার্চুমিক

6

আমার প্রাথমিক যদিও আপনি যে ব্যতিক্রমটি ধরছেন / নিক্ষেপ করছেন তার নামে একটি টাইপো রয়েছে তবে আপনার কোডটি যদি ঠিক একই হয় তবে আমি ঠিক জানি না ঠিক কী চলছে।

মূল লিপির নিম্নলিখিত পরিবর্তনটি চেষ্টা করে দেখুন এবং আপনার ফলাফলগুলি আটকান। এটি আপনার সমস্যাটি কিছুটা আরও ভালভাবে নির্ণয় করতে সহায়তা করবে।

<?php

//set up exception handler to report what we didn't catch
function exception_handler($exception) {

    if($exception instanceof MyException) {
        echo "you didn't catch a myexception instance\n";

    } else if($exception instanceof Exception) {
        echo "you didn't catch a exception instance\n";

    } else {
        echo "uncaught exception of type: ".gettype($exception)."\n";
    }

    echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

//install the handler
set_exception_handler('exception_handler');

class MyException extends Exception {
}

function inverse($x) {
    if (!$x) {
        throw new MyException('Division by zero.');
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (MyException $e) {
    echo 'Caught myexception: ',  $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// Continue execution
echo 'Hello World';
?>

4

নিম্নলিখিত কনফিগারেশনগুলিতে আমার একই সমস্যা ছিল,

পিএইচপি 5.2.14 (ক্লিটার) (নির্মিত: আগস্ট 12 2010 17:32:30) কপিরাইট (সি) 1997-2010 পিএইচপি গ্রুপ জেন্ড ইঞ্জিন v2.2.0, কপিরাইট (সি) 1998-2010 ইএ্যাকসিলেটর v0.9.5 সহ জেন্ড টেকনোলজিস । 1 , কপিরাইট (সি) 2004-2006 ইএক্সিলেটর, ইএ এক্সিলেরেটর দ্বারা

সমাধানটি হয় eAccelerator অক্ষম করা বা এটি আপডেট করা। আমি উভয় চেষ্টা করেছিলাম এবং উভয় ফিক্সগুলি কাজ করে। বাগটি এখানে https://eaccelerator.net/ticket/242 (এনবি। ফায়ারফক্স তাদের এসএসএল শংসাপত্র সম্পর্কে অভিযোগ করেছে) হিসাবে রিপোর্ট করা হয়েছে ।

এখন আমি নিম্নলিখিত কনফিগারেশনের সাহায্যে সঠিকভাবে ধরার চেষ্টা চালাচ্ছি,

পিএইচপি 5.2.4 (ক্লিটার) (নির্মিত: অক্টোবর 16 2007 09:13:35) কপিরাইট (সি) 1997-2007 পিএইচপি গ্রুপ জেন্ড ইঞ্জিন v2.2.0, কপিরাইট (সি) 1998-2007 ইএ্যাকসিলেটর v0.9.6 সহ জেন্ড টেকনোলজিস । 1 , কপিরাইট (সি) 2004-2010 ইএ্যাকসিলেরেটর, ই-এক্সিলেরেটর দ্বারা


4

Ception ব্যতিক্রম আমার পক্ষে কাজ করে না তবে আমি একটি সমাধান পেয়েছি।

আমাকে চেষ্টা {} ক্যাচ (ব্যতিক্রম $ ই) {replace দ্বারা চেষ্টা করে try} ক্যাচ (থ্রোয়েবল $ ই) replace} প্রতিস্থাপন করতে হবে}

আরও তথ্যের জন্য: https://trowski.com/2015/06/24/throwable-exception-and-erferences-in-php7/


3

এক্সডিবাগে একটি সেটিং রয়েছে:

xdebug.show_exception_trace = 1

এটি পিএইচপি এমনকি একটি চেষ্টা ক্যাচ ব্লকেও আউটপুট ব্যতিক্রম করতে বাধ্য করবে। এটি চালু করুন0


4
আমার ক্ষেত্রে আমাকে xdebug মডিউলটি সম্পূর্ণরূপে অক্ষম করতে হয়েছিল (xdebug.show_exception_trace পরিবর্তন করা যথেষ্ট ছিল না)।
টমাস সাহলিন

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

3

আপনি যদি পিএইচপি 7 ব্যবহার করছেন তবে আপনার ব্যতিক্রমের পরিবর্তে থ্রোয়েবলের প্রয়োজন হতে পারে


এটি একটি বরং পুরাতন পোস্ট। উত্তর দেওয়ার সিদ্ধান্ত নেওয়ার আগে বিষয়ের তারিখটি একবার দেখুন। এর পাশাপাশি আপনার উত্তরটি হ'ল সত্যই তেমন সহায়ক নয়: - সম্পূর্ণ নয় - কোনও ব্যাখ্যা কেন নয়
মনোফোন

4
ব্যাখ্যাটি হ'ল পিএইচপি 7 ব্যতিক্রমের পরিবর্তে থ্রোয়েবল ব্যবহার করে। আমি যখন সমস্যার মুখোমুখি হলাম তখন এই আলোচনাটি প্রথম খুঁজে পেয়েছিলাম এবং আমি অবদান রাখতে চেয়েছিলাম। এই জাতীয় মতামত স্ট্যাক সম্প্রদায়ের বান্ধব না হওয়ার কারণ।
ব্যবহারকারী 5528384

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

2

টিএলডিআর; আপনার use Exception;উভয় পিএইচপি ফাইলের শীর্ষে রয়েছে তা নিশ্চিত করুন



1

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

try
{
  $number = 5/0; //or other exception
}
catch(Exception $e)
{
  throw $e;
}

মধ্যে:

try
{
  $number = 5/0; //or other exception
}
catch(Exception $e)
{
  throw new Exception($e->getMessage(),$e->getCode());
}

এটা কাজ করে।

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