ব্যতিক্রম পরিচালনার সঠিক উপায় কী?


20

জুমলা কোরে আমি এখনও এর মতো অনেকগুলি কল পাই:

    // Check for errors.
    if (count($errors = $this->get('Errors')))
    {
        JError::raiseError(500, implode("\n", $errors));
        return false;
    }

প্ল্যাটফর্ম 12.1 প্রকাশের পর থেকে জেরার অবচিত হয়। সুতরাং আমি কীভাবে স্ট্যান্ডার্ড পিএইচপি ব্যতিক্রম ব্যবহার করব।


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

উত্তর:


17

@ দিমিত্রিরেকুন যেমন বলেছিলেন, এখানে একটি ভাল আলোচনা রয়েছে । এই সমস্ত বিবেচনার মূল অংশটি হ'ল আপনার কোন ধরণের ত্রুটি রয়েছে?

দুটি ধরণের ত্রুটি রয়েছে:

  1. পুনর্লভ্য
  2. অপুনরুদ্ধারযোগ্য।

পার্থক্যটি আমি নীচে যোগ করতে চাই:

Can I still show the page that was requested, even though this error occurred?
  • হ্যাঁ? - পুনরুদ্ধারযোগ্য
  • কোন? - অপরিবর্তনযোগ্য

এখন আমরা জানি যে আমরা কী নিয়ে কাজ করছি। তোমার কি করা উচিত?

ত্রুটি অপুনরুদ্ধারযোগ্য হয়, তাহলে আপনি একটি ত্রুটি পৃষ্ঠা তাদের পুনর্নির্দেশ করতে চান পরিবর্তে অনুরোধ করা পৃষ্ঠাটি উপর চালিয়ে । এটি নিম্নলিখিতগুলির মতো সহজ:

throw new Exception(JText::_('COM_MYCOMP_ERROR_MESSAGE_NOT_FOUND'), 404);

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

যদি ত্রুটিটি পুনরুদ্ধারযোগ্য হয় তবে আপনি সম্ভবত তাদের ব্যবহারকারীদের অনুরোধ করা পৃষ্ঠাটি প্রদর্শন করার সময় শেষ ব্যবহারকারীকে কোনও বার্তা প্রদর্শন করতে চান। এর অর্থ সাধারণত যে আপনি অ্যাপ্লিকেশনটির জন্য একটি বার্তা 'সজ্জিত' করা উচিত:

JFactory::getApplication()->enqueueMessage($error, 'error');

enqueueMessageদুটি পরামিতি লাগে, ত্রুটি বার্তা এবং একটি বার্তার ধরণ। এখানে আরও তথ্য (নীচে)।


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

সেক্ষেত্রে আপনি কোডটি মোড়তে চান যা চেষ্টা করে ব্যতিক্রম করতে পারে ... ধরুন বিভাগটি:

try {
    // exception generating code
    throw new Exception('Normally you would have other code that calls a class that throws the exception', 500);
} catch (Exception $e) {
    $msg = $e->getMessage(); // Returns "Normally you would have other code...
    $code = $e->getCode(); // Returns '500';
    JFactory::getApplication()->enqueueMessage($msg, 'error'); // commonly to still display that error
}

নোট করুন আপনি যা করছেন তা অপরিশোধনযোগ্য ত্রুটি "ধরা" এবং সিস্টেমটিকে পুনরুদ্ধার করতে এবং অনুরোধ করা পৃষ্ঠাটি প্রদর্শন করা চালিয়ে যেতে বাধ্য করছে।


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

সুতরাং আমি নিম্নলিখিত হিসাবে এটি আবার লিখতে হবে:

// Check for errors.
if (count($errors = $this->get('Errors')))
{
    throw new Exception(implode("\n", $errors), 500);
    return false; // you can remove this too, technically since the exception will take you out of this function.
}

ভাল উত্তর! তবে আমি নির্ভর করব না $this->get('Errors')কারণ এটিও হ্রাস পেয়েছে।
দিমিত্রি রেকুন

ব্যর্থ প্রতিবেদনের উপর কোনও মন্তব্য, যা অভ্যন্তরীণ ত্রুটি? আমি চাই যে প্রোগ্রামটি একটি ব্যর্থতার দাবিতে অবিলম্বে মারা যায় - এটি করার কোনও জুমলা-নির্দিষ্ট উপায় আছে কি? এই মুহুর্তে আমি যদি JDEBUGহ'ল হ্যান্ডলারটি নিবন্ধিত করি true
ওলে হার্স্টেট

12

এখানে আমি কীভাবে ত্রুটিগুলি পরিচালনা করছি।

দেখুন বা নিয়ামক

try
{
    $this->item = $this->get('Item');
}
catch (Exception $e)
{
    if ($e->getCode() == 404)
    {
        // Not found
        throw new Exception($e->getMessage(), 404);
    }

    // Generic errors
    JFactory::getApplication()->enqueueMessage(JText::_('COM_MYCOMP_ERROR_OCCURRED'), 'error');
}

সুতরাং যদি আমি আমার মডেল থেকে 404 কোড পাই (উদাহরণস্বরূপ):

if (empty($data))
{
    throw new Exception(JText::_('COM_MYCOMP_ERROR_MESSAGE_NOT_FOUND'), 404);
}

তারপরে আমি এটিকে ভিউ বা কন্ট্রোলারে ধরা এবং আরও একটি ব্যতিক্রম ছুঁড়ে ফেলি যা জুমলা হ্যান্ডেল করবে এবং 404 পৃষ্ঠা প্রদর্শিত হবে। অন্য যে কোনও জন্য আমি ব্যবহারকারীর কাছে কিছু জেনেরিক ত্রুটি বার্তা প্রদর্শন করি।

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


4

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

// Check for errors.
if (count($errors = $this->get('Errors'))) {
    foreach($errors as $error) {
        JFactory::getApplication()->enqueueMessage($error, 'error');
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.