আমি কীভাবে একটি ব্যতিক্রম সম্পর্কে অতিরিক্ত তথ্য সরবরাহ করব?


20

প্রতিবারই আমাকে একটি ব্যতিক্রম সম্পর্কে অতিরিক্ত তথ্য সরবরাহ করতে হবে আমি ভাবছি যে উপায়টি আসলে এটি করার সঠিক উপায়।


এই প্রশ্নের খাতিরে আমি একটি উদাহরণ লিখেছি। আসুন ধরে নেওয়া যাক এমন একটি শ্রেণি রয়েছে যেখানে আমরা Abbreviationসম্পত্তি আপডেট করতে চাই । সলিউড দৃষ্টিকোণ থেকে এটি নিখুঁত হতে পারে না তবে আমরা যদি ডিআই এর মাধ্যমে কর্মী-পদ্ধতিটি কিছু পরিষেবা দিয়ে পাস করি তবে একই পরিস্থিতি ঘটতে পারে - একটি ব্যতিক্রম ঘটলে এর কোনও প্রসঙ্গ নেই। উদাহরণে ফিরে যান ...

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Abbreviation { get; set; }
}

তারপরে ক্লাসের কয়েকটি উদাহরণ এবং লুপ রয়েছে যেখানে কর্মী-পদ্ধতি বলা হয়। এটা ছুড়ে দিতে পারে StringTooShortException

var persons =
{
    new Person { Id = 1, Name = "Fo" },
    new Person { Id = 2, Name = "Barbaz" },
}

public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
    foreach (var person in persons)
    {
        try
        {
            person.Abbreviation = GenerateAbbreviation(person.Name);
        }
        catch(Exception ex)
        {
            // ?
        }
    }
    // throw AggregateException...
}

public IEnumerable<string> GenerateAbbreviation(string value)
{
    if (value.Length < 5)
    {
        throw new StringTooShortException(value);
    }

    // generate abbreviation
}

অনুসন্ধানটি হ'ল: কীভাবে এটি Personবা এর Id(বা অন্য কিছু) যুক্ত করবেন?


আমি নিম্নলিখিত তিনটি কৌশল জানি:


1 - Dataসম্পত্তি ব্যবহার করুন

পেশাদাররা:

  • অতিরিক্ত তথ্য সেট করা সহজ
  • এমনকি আরও ব্যতিক্রম তৈরি করার প্রয়োজন হয় না
  • অতিরিক্ত প্রয়োজন হয় না try/catch

কনস:

  • সহজেই এর মধ্যে সংহত করা যায় না Message
  • লগাররা এই ক্ষেত্রটিকে উপেক্ষা করে এবং তা ফেলে দেবে না
  • কীগুলি প্রয়োজন এবং কাস্টিং বিকেসু মানগুলি দরকার object
  • অপরিবর্তনীয় নয়

উদাহরণ:

public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
    foreach (var person in persons)
    {
        try
        {
            person.Abbreviation = GenerateAbbreviation(person.Name);
        }
        catch(Exception ex)
        {
            ex.Data["PersonId"] = person.Id;
            // collect ex
        }
    }
    // throw AggregateException...
}

2 - কাস্টম বৈশিষ্ট্য ব্যবহার করুন

পেশাদাররা:

  • Dataসম্পত্তি অনুরূপ কিন্তু দৃ strongly়ভাবে টাইপ
  • একীভূত করা সহজ Message

কনস:

  • কাস্টম ব্যতিক্রম প্রয়োজন
  • লগার তাদের উপেক্ষা করবে
  • অপরিবর্তনীয় নয়

উদাহরণ:

public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
    foreach (var person in persons)
    {
        try
        {
            person.Abbreviation = GenerateAbbreviation(person.Name);
        }
        catch(Exception ex)
        {
            // not suitable for this exception because 
            // it doesn't have anything in common with the Person
        }
    }
    // throw AggregateException...
}

3 - অন্য একটি ব্যতিক্রম ব্যতিক্রম মোড়ানো

পেশাদাররা:

  • Message অনুমানযোগ্য পদ্ধতিতে ফর্ম্যাট করা যায়
  • লগারগুলি অভ্যন্তরীণ ব্যতিক্রমগুলি ডাম্প করবে
  • অপরিবর্তনীয়

কনস:

  • অতিরিক্ত প্রয়োজন try/catch
  • বাসা বাড়ায়
  • অভিযানের গভীরতা বৃদ্ধি করে

উদাহরণ:

public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
    foreach (var person in persons)
    {
        try
        {
            try
            {
                person.Abbreviation = GenerateAbbreviation(person.Name);
            }
            catch(Exception ex)
            {
                throw new InvalidPersonDataException(person.Id, ex);
            }
        }
        catch(Exception ex)
        {
            // collect ex
        }
    }
    // throw AggregateException...
}

  • অন্য কোন নিদর্শন আছে?
  • আরও ভাল নিদর্শন আছে?
  • আপনি কি তাদের / তাদের সবার জন্য সেরা অনুশীলনের পরামর্শ দিতে পারেন?

সি # তে ব্যতিক্রমগুলির সাথে পরিচিত নই তবে আমি ব্যতিক্রমটি ছুঁড়ে ফেলা হলে সাধারণত ব্যক্তির উদাহরণটি বৈধ হওয়ার প্রত্যাশা করব। আপনি কি চেষ্টা করেছেন?
জন কৌরাক্লিস

1
@ জোহানকৌরাক্লিস এই প্রশ্নটি যা নয় তা নয় ;-) অতিরিক্ত তথ্য দ্বারা আমি কী বোঝাতে চাইছি তা প্রদর্শন করার জন্য এটি একটি অত্যন্ত সাধারণ উদাহরণ। আমি যদি এখানে একটি সম্পূর্ণ কাঠামো পোস্ট করি যেখানে মাল্টিপল পদ্ধতিগুলি ব্যতিক্রমগুলি ফেলতে পারে এবং প্রসঙ্গের তথ্যের স্তরের স্তরের স্তর সরবরাহ করা উচিত যাতে কেউ সম্ভবত এটি পড়তে পারে না এবং এটি ব্যাখ্যা করার জন্য আমার কাছে খুব কঠিন সময় ছিল।
t3chb0t

@ জনকৌরাক্লিস আমি কেবল এটি প্রদর্শনের উদ্দেশ্যে তৈরি করেছি।
t3chb0t

@ t3chb0t আমি মনে করি আপনি এখানে নিজের প্রশ্নের উত্তর দিয়েছেন। 1, 2, এবং 3 উত্তরে সরানো এবং আপনার প্রশ্নটি সামঞ্জস্য করার বিষয়টি বিবেচনা করুন যাতে এটি আমার মতের উপর ভিত্তি করে কোনও স্টাইল বেছে নিতে বলছে না।
candied_orange

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

উত্তর:


6

Data এফটিডব্লিউ

আপনার "বিপরীতে":

  • "বার্তায় সহজেই সংহত করা যায় না"

-> জন্য আপনার ব্যতিক্রম ধরনের, এটিকে ওভাররাইড করতে সহজ যথেষ্ট হওয়া উচিত Messageযাতে এটি না ইনকর্পোরেট Data.. যদিও আমি শুধু এই বিবেচনা করবে Dataবার্তা

  • "লগাররা এই ক্ষেত্রটিকে উপেক্ষা করে এবং এটিকে ফেলে দেবে না"

একটি উদাহরণ হিসাবে Nlog জন্য Googling উৎপাদনের :

ব্যতিক্রম লেআউট রেন্ডারার

(...)

ফর্ম্যাট - আউটপুট ফর্ম্যাট। ব্যতিক্রম বৈশিষ্ট্য একটি কমা দিয়ে পৃথক করা তালিকা করতে হবে: Message, Type, ShortType, ToString, Method, StackTrace& Data। এই প্যারামিটার মানটি কেস-সংবেদনশীল। ডিফল্ট:message

সুতরাং এটি সহজেই কনফিগারযোগ্য বলে মনে হচ্ছে।

  • কীগুলি এবং কাস্টিং প্রয়োজন কারণ মানগুলি বস্তু are

তাই না? কেবলমাত্র সেখানে বস্তুগুলি ফেলে দিন এবং নিশ্চিত করুন যে তাদের ব্যবহারযোগ্য ToString()পদ্ধতি রয়েছে।

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


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


আমি এই সিদ্ধান্তে পৌঁছেছি যে একটি ব্যতিক্রম সম্পর্কে দরকারী মাত্র দুটি জিনিস আছে, এর নাম এবং বার্তা। অন্য সব কিছুই কেবল অকেজো শব্দ যা এড়াতে পারে এবং এড়ানো উচিত কারণ এটি কেবল খুব ভঙ্গুরের উপর নির্ভর করে।
t3chb0t

2

আপনি ব্যতিক্রম কেন ছুঁড়েন? তাদের ধরা এবং পরিচালনা করা

কিভাবে আকর্ষণীয় কোড পরামর্শ কাজে লাগানো যায় কিভাবে ব্যতিক্রম হ্যান্ডেল কিভাবে? ব্যতিক্রম অবজেক্টে আপনি যে বৈশিষ্ট্যগুলি নির্ধারণ করেন সেগুলি ব্যবহার করে।

ব্যতিক্রম চিহ্নিত করতে বা বার্তা বৈশিষ্ট্যটি কখনও ব্যবহার করবেন না বা কোনও সম্ভাব্য হ্যান্ডলারের উপর নির্ভর করা উচিত এমন "তথ্য" সরবরাহ করতে হবে না। এটি কেবল খুব অস্থির এবং অবিশ্বাস্য।

আমি "ডেটা" সম্পত্তিটি আগে কখনও ব্যবহার করি নি তবে এটি আমার কাছে অত্যধিক জেনেরিক বলে মনে হয়।

আপনি ব্যাতিক্রমের অনেকগুলি ক্লাস না তৈরি করেন, যার মধ্যে প্রতিটি একটি নির্দিষ্ট ব্যতিক্রমী কেস সনাক্ত করে, আপনি যখন "ডেটা" প্রতিনিধিত্ব করেন ব্যতিক্রমটিকে ধরেন তখন আপনি কীভাবে জানবেন ? ("বার্তা" সম্পর্কে পূর্ববর্তী মন্তব্য দেখুন)।


1
আমি বলব, Dataপরিচালনা করার জন্য অকেজো, তবে Messageনরকের বিন্যাসকরণ এড়ানোর জন্য লগিংয়ের পক্ষে মূল্যবান ।
মার্টিন বা

-1

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

public IEnumerable<Person> GenerateAbbreviation(IEnumerable<Person> persons)
{
    var exceptions = new List<InvalidPersonDataException>();

    foreach (var person in persons)
    {
        try
        {
            person.Abbreviation = GenerateAbbreviation(person.Name);
        }
        catch(Exception ex)
        {
            exceptions.Add(new InvalidPersonDataException(person.Id, ex));
        }
    }

    if (exceptions.Any())
    {
        throw new AggregateException(exceptions);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.