আমি কীভাবে রাকুতে অন্য থ্রেডে ফেলে দেওয়া ত্রুটিগুলি প্রচার করতে পারি এবং ধরতে পারি?


9

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


হতে পারে fooএবং barএখানে কি নির্মূল করা যাবে?
jjmerelo

1
এই দৃশ্যে আমার এখনও সমস্যা হচ্ছে ... এটি কি রাকুতে সম্ভব নয় এবং প্রকৃত ক্লাসগুলির পুনর্গঠন প্রয়োজন? এটি আদর্শ হবে না কারণ আমি ক্লাসে অ্যাপ্লিকেশন নির্দিষ্ট ত্রুটি পরিচালনা করতে চাই না যা অন্য কোথাও পুনরায় ব্যবহার করা যেতে পারে ...
ryn1x

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

বর্তমান উত্তরটি আমার পক্ষে পুরোপুরি যথেষ্ট। আমি প্রশ্নটি পরিবর্তিত করেছি কারণ এখানে যে শেষ হয় তার পক্ষে এটি খুব দীর্ঘ এবং নির্দিষ্ট হয়ে উঠছিল।
ryn1x

উত্তর:


6

ব্যবহার await

উদাহরণস্বরূপ, আপনার কোডে এই তিনটি লাইন প্রতিস্থাপন করুন:

foo;
bar;
baz;

সঙ্গে:

await foo, bar, baz;

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

5

তাত্ত্বিকভাবে, এই কোডটি মারা উচিত :

ভাষার d.২ সংস্করণ হিসাবে, ডুবন্ত প্রসঙ্গে ব্যবহৃত স্টেট স্টেট স্টেটমেন্টটি স্বয়ংক্রিয়ভাবে একটি ব্যতিক্রম হ্যান্ডলার সংযুক্ত করবে। যদি প্রদত্ত কোডটিতে কোনও ব্যতিক্রম ঘটে থাকে তবে এটি মুদ্রিত হবে এবং প্রোগ্রামটি তখন প্রস্থান করবে, যদি কোনও প্রারম্ভিক জড়িত জড়িত ব্যতীত এটি ছুঁড়ে দেওয়া হয়।

use v6.c;
start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello␤» 

use v6.d;
start { die }; sleep ⅓; say "hello";
# OUTPUT: 
# Unhandled exception in code scheduled on thread 4 
# Died 
#     in block  at -e line 1 

এক্ষেত্রে এটি একটি অদ্ভুত পরিস্থিতি কারণ আপনি প্রতিশ্রুতিটি ডুবছেন না (আপনি এটি ফিরিয়ে দিচ্ছেন) তবে অবশেষে আপনি এটি ডুবে যাবেন কারণ আপনি এটি অকার্যকর প্রসঙ্গে চালাচ্ছেন।

একই ডকুমেন্টেশন আপনাকে সমাধান দেয়: প্রসঙ্গে ডুবে না:

# Don't sink it: 
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello␤» 

# Catch yourself: 
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";

যেহেতু আপনার প্রোগ্রামটি মারা যায় না, তাই আমি বলব যে আপনি দ্বিতীয় পরিস্থিতিতে আছেন। কিছু কারণে, এটি ডুবে না। তবে পরিস্থিতি যা-ই হোক না কেন, সমাধান একই: আপনাকে একই কোড ব্লকের অভ্যন্তরে ব্যতিক্রম ধরা দরকার।

সমাধান: awaitপ্রতিশ্রুতি (যা এটি ডুবে না) বা এটি কিছু ভেরিয়েবলকে অর্পণ করে, যাতে পার্শ্ববর্তী কোডটিও মারা যায়। তবে আপনার ওপিকে সাড়া দিয়ে, না, আপনি অন্য থ্রেড থেকে একটি ব্যতিক্রম ধরতে পারবেন না, একইভাবে আপনি অন্য ব্লক থেকে ব্যতিক্রম ধরতে পারবেন না।


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

4

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

উদাহরণ:

my $errors = Channel.new;

my $err-supply = $errors.Supply;
$err-supply.tap(-> $e {say "handle error: $e"});

start {
    die "something went horribly wrong";

    CATCH {
        default {
            $errors.send($_);
        }
    }
}

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