কেন বাদে (চেক) ব্যতিক্রম ব্যবহার করবেন?


17

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

একটা প্রধান সুবিধা Eitherবেশি হয়েছে Exceptionভাল পারফরম্যান্স হয়; একটি Exceptionস্ট্যাক-ট্রেস তৈরির প্রয়োজন এবং নিক্ষেপ করা হচ্ছে। যতদূর আমি বুঝতে পারি, যদিও, নিক্ষেপ করা Exceptionদাবী অংশ নয়, তবে স্ট্যাক-ট্রেস তৈরি করা।

তবে তারপরে, কেউ সর্বদা Exceptionএর সাথে নির্মাণ / উত্তরাধিকারী হতে scala.util.control.NoStackTraceপারে এবং আরও অনেক কিছু, আমি প্রচুর ক্ষেত্রে দেখতে পাচ্ছি যে যেখানে Eitherসত্যিকারের বাম দিকটি আসলে Exception(পারফরম্যান্স বৃদ্ধির পক্ষে)।

অন্য একটি সুবিধা Eitherহ'ল সংকলক-সুরক্ষা; স্কালা সংকলকটি হ্যান্ডেল না করা Exception(জাভা সংকলকটির বিপরীতে) সম্পর্কে অভিযোগ করবে না । তবে যদি আমি ভুল না হয়ে থাকি তবে এই সিদ্ধান্তটি একই কারণে যুক্তিযুক্ত যা এই বিষয়ে আলোচিত হচ্ছে, তাই ...

সিনট্যাক্সের ক্ষেত্রে, আমার কাছে মনে হচ্ছে- Exceptionস্টাইলটি আরও পরিষ্কার। নিম্নলিখিত কোড ব্লক পরীক্ষা করুন (উভয় একই কার্যকারিতা অর্জন করে):

Either শৈলী:

def compute(): Either[String, Int] = {

    val aEither: Either[String, String] = if (someCondition) Right("good") else Left("bad")

    val bEithers: Iterable[Either[String, Int]] = someSeq.map {
        item => if (someCondition(item)) Right(item.toInt) else Left("bad")
    }

    for {
        a <- aEither.right
        bs <- reduce(bEithers).right
        ignore <- validate(bs).right
    } yield compute(a, bs)
}

def reduce[A,B](eithers: Iterable[Either[A,B]]): Either[A, Iterable[B]] = ??? // utility code

def validate(bs: Iterable[Int]): Either[String, Unit] = if (bs.sum > 22) Left("bad") else Right()

def compute(a: String, bs: Iterable[Int]): Int = ???

Exception শৈলী:

@throws(classOf[ComputationException])
def compute(): Int = {

    val a = if (someCondition) "good" else throw new ComputationException("bad")
    val bs = someSeq.map {
        item => if (someCondition(item)) item.toInt else throw new ComputationException("bad")
    }

    if (bs.sum > 22) throw new ComputationException("bad")

    compute(a, bs)
}

def compute(a: String, bs: Iterable[Int]): Int = ???

আধুনিক রূপ আমার জন্য অনেক ক্লিনার, এবং কোড (চালু পারেন প্যাটার্ন-তুল্য ব্যর্থতা হ্যান্ডলিং Eitherবা try-catch) উভয় ক্ষেত্রেই বেশ স্পষ্ট।

সুতরাং আমার প্রশ্নটি হল - কেন Eitherওভার (চেকড) ব্যবহার করবেন Exception?

হালনাগাদ

উত্তরগুলি পড়ার পরে, আমি বুঝতে পারি যে আমি আমার দ্বিধাটির মূল উপস্থাপন করতে ব্যর্থ হয়েছি। আমার উদ্বেগ অভাবের সাথে নয়try-catch ; যে কোনও একটি Exceptionদিয়ে "ধরা" দিতে পারে Try, বা catchএর ব্যতিক্রমটি মোড়ানোর জন্য ব্যবহার করতে পারেLeft

সঙ্গে আমার প্রধান সমস্যা Either/Try আসে যখন আমি যে পথ ধরে অনেক বিন্দুতে ব্যর্থ হতে পারে কোড লিখতে; এই পরিস্থিতিতে, যখন কোনও ব্যর্থতার মুখোমুখি হয়, তখন আমার পুরো কোড জুড়ে সেই ব্যর্থতাটি প্রচার করতে হবে, এইভাবে কোডের পথটিকে আরও জটিল করে তোলা হয়েছে (যেমন পূর্বোক্ত উদাহরণগুলিতে দেখানো হয়েছে)।

Exceptionএস ব্যবহার না করে কোড ভাঙার অন্য উপায় আছে return(যা আসলে স্কালায় অন্য একটি "ট্যাবু")। কোডটি এখনও Eitherপদ্ধতির চেয়ে পরিষ্কার হবে, এবং Exceptionশৈলীর চেয়ে কিছুটা কম পরিষ্কার হওয়ার পরেও , অ-ধরায়দের কোনও ভয় নেই Exception

def compute(): Either[String, Int] = {

  val a = if (someCondition) "good" else return Left("bad")

  val bs: Iterable[Int] = someSeq.map {
    item => if (someCondition(item)) item.toInt else return Left("bad")
  }

  if (bs.sum > 22) return Left("bad")

  val c = computeC(bs).rightOrReturn(return _)

  Right(computeAll(a, bs, c))
}

def computeC(bs: Iterable[Int]): Either[String, Int] = ???

def computeAll(a: String, bs: Iterable[Int], c: Int): Int = ???

implicit class ConvertEither[L, R](either: Either[L, R]) {

  def rightOrReturn(f: (Left[L, R]) => R): R = either match {
    case Right(r) => r
    case Left(l) => f(Left(l))
  }
}

মূলত return Leftপ্রতিস্থাপন throw new Exception, এবং উভয়ই অন্তর্নিহিত পদ্ধতি rightOrReturnহ'ল স্ট্যাকটি স্বয়ংক্রিয় ব্যতিক্রম প্রচারের পরিপূরক।



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

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

2
@ রবার্টহারভে: প্রযুক্তিগতভাবে বলতে গেলে Eitherনিজেই কোনও মোনাদ নয়। অভিক্ষেপ পারেন ডানে না বামে পাশ থেকে একটি একসংখ্যা, কিন্তু Eitherনিজে নয়। যদিও আপনি এটি বাম দিক বা ডানদিকে "বাইসিং" করে একটি মোনাদ তৈরি করতে পারেন । যাইহোক, তারপর আপনি একটি উভয় পক্ষের একটি নির্দিষ্ট শব্দার্থক দেওয়া Either। স্কালার Eitherমূলত নিরপেক্ষ ছিল, তবে সম্প্রতি পক্ষপাতদুষ্ট ছিল, সুতরাং আজকাল এটি আসলে একটি মোনাদ, তবে "একাকীকরণ" এর অন্তর্নিহিত সম্পত্তি Eitherনয় বরং এটি পক্ষপাতদুষ্ট হওয়ার ফলস্বরূপ।
জার্গ ডব্লু মিট্টাগ

@ জার্গডব্লিউমিত্যাগ: ভাল, ভাল এর অর্থ হল যে আপনি এটিকে সমস্ত মারাত্মক কল্যাণের জন্য ব্যবহার করতে পারেন এবং ফলস্বরূপ কোডটি কীভাবে "পরিষ্কার" করে বিরক্ত হন না (যদিও আমি সন্দেহ করি যে ব্যতিক্রমী সংস্করণের চেয়ে কার্যকরী-শৈলীর ধারাবাহিকতা কোডটি আরও পরিষ্কার হবে)।
রবার্ট হার্ভে

উত্তর:


13

আপনি যদি কেবল Eitherএকটি অপরিহার্য try-catchব্লকের মতো ব্যবহার করেন তবে অবশ্যই এটি একই জিনিসটি করতে বিভিন্ন সিনট্যাক্সের মতো দেখাচ্ছে। Eithersএকটি মান হয় । তাদের একই সীমাবদ্ধতা নেই। আপনি পারেন:

  • আপনার চেষ্টা ব্লকগুলি ছোট এবং সামঞ্জস্যপূর্ণ রাখার অভ্যাসটি বন্ধ করুন। "ধরা" অংশটির Eithers"চেষ্টা" অংশের ঠিক পাশে হওয়া দরকার নেই। এমনকি এটি একটি সাধারণ কার্যক্রমে ভাগ করা যেতে পারে। এটি যথাযথভাবে উদ্বেগগুলি আলাদা করা আরও সহজ করে তোলে।
  • Eithersডেটা স্ট্রাকচারে স্টোর করুন । আপনি এগুলি দিয়ে লুপ করতে পারেন এবং ত্রুটি বার্তাগুলি একত্রিত করতে পারেন, ব্যর্থ হয় নি এমন প্রথমটি আবিষ্কার করুন, অলসভাবে সেগুলি মূল্যায়ন করুন বা অনুরূপ।
  • এগুলি প্রসারিত করুন এবং কাস্টমাইজ করুন। এমন কিছু বয়লারপ্লেট পছন্দ করবেন না যার সাথে আপনি লিখতে বাধ্য হয়েছেন Eithers? আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে তাদের সাথে কাজ করা আরও সহজ করার জন্য আপনি সহায়ক ফাংশনগুলি লিখতে পারেন। ট্র্যাচ-ক্যাচের বিপরীতে, ভাষা ডিজাইনাররা কেবলমাত্র সেই ডিফল্ট ইন্টারফেসের সাথে স্থায়ীভাবে আটকে থাকেন না।

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

আমার অভিজ্ঞতায়, Eithersসত্যিকার অর্থে অগ্রাধিকার দেওয়া হয় Trysনা যদি না Leftএটি ব্যতীত অন্য কিছু না হয় Exception, সম্ভবত কোনও বৈধতা ত্রুটি বার্তা এবং আপনি Leftমানগুলি একত্রিত করতে চান । উদাহরণস্বরূপ, আপনি কিছু ইনপুট প্রক্রিয়াকরণ করছেন এবং আপনি প্রথম বারে কেবল ত্রুটি নয়, সমস্ত ত্রুটি বার্তা সংগ্রহ করতে চান । কমপক্ষে আমার জন্য এই পরিস্থিতিগুলি প্রায়শই অনুশীলনে আসে না।

ট্র্যাচ-ক্যাচ মডেলটির বাইরে দেখুন এবং এতে কাজ করতে আপনি Eithersআরও অনেক আনন্দদায়ক দেখতে পাবেন ।

আপডেট: এই প্রশ্নটি এখনও মনোযোগ পাচ্ছে, এবং সিন্টেক্স প্রশ্নটি স্পষ্ট করে ওপির আপডেটটি আমি দেখিনি, তাই আমি ভেবেছিলাম আমি আরও যুক্ত করব।

ব্যতিক্রম মানসিকতার বাইরে যাওয়ার উদাহরণ হিসাবে, আমি সাধারণত আপনার উদাহরণ কোডটি এভাবে লিখব:

def compute(): Either[String, Int] = {
  Right(someSeq)
    .filterOrElse(someACondition,            "someACondition failed")
    .filterOrElse(_ forall someSeqCondition, "someSeqCondition failed")
    .map(_ map {_.toInt})
    .filterOrElse(_.sum <= 22, "Sum is greater than 22")
    .map(compute("good",_))
}

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

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


1. পৃথক করতে সক্ষম হওয়া tryএবং catchএকটি ন্যায্য যুক্তি, তবে এটি কী সহজেই অর্জন করা যায়নি Try? ২. Eitherডেটা স্ট্রাকচারে গুলি স্টোরেজ throwsপ্রক্রিয়াটির পাশাপাশি করা যেতে পারে ; ব্যর্থতাগুলি পরিচালনা করার উপরে এটি কেবল অতিরিক্ত স্তর নয়? ৩. আপনি অবশ্যই প্রসারিত করতে পারেন Exception। অবশ্যই, আপনি try-catchকাঠামোটি পরিবর্তন করতে পারবেন না , তবে ব্যর্থতাগুলি পরিচালনা করা এতটা সাধারণ যে আমি অবশ্যই ভাষাটি আমাকে তার জন্য একটি বয়লারপ্লেট দিতে চাই (যা আমি ব্যবহার করতে বাধ্য হই না)। এটাই বলার মতো যে বোঝাপড়া খারাপ কারণ এটি মনাদিক ক্রিয়াকলাপগুলির জন্য একটি বয়লারপ্লেট।
ইয়াল রথ

আমি কেবল বুঝতে পেরেছি যে আপনি বলেছিলেন যে Eitherগুলি বাড়ানো যেতে পারে, যেখানে স্পষ্টত তারা তা করতে পারে না ( sealed traitকেবল দুটি বাস্তবায়ন সহ উভয়ই final)। আপনি কি এ সম্পর্কে বিস্তারিত বলতে পারেন? আমি ধরে নিচ্ছি আপনি প্রসারিত করার আক্ষরিক অর্থ বোঝাতে চাইছেন না।
আইয়াল রথ

1
আমি ইংরেজি শব্দ হিসাবে প্রসারিত মানে, প্রোগ্রামিং কীওয়ার্ড নয়। সাধারণ নিদর্শনগুলি পরিচালনা করতে ফাংশন তৈরি করে কার্যকারিতা যুক্ত করা।
কার্ল বিলেফেল্ট

8

দুটি আসলে খুব আলাদা। Eitherসম্ভাব্য ব্যর্থ গণনা উপস্থাপনের চেয়ে শব্দার্থক শব্দগুলি অনেক বেশি সাধারণ।

Eitherআপনাকে দুটি ভিন্ন ধরণের যেকোন একটিতে ফিরে আসতে দেয়। এটাই.

এখন, এই দুটি ধরণের মধ্যে একটি ত্রুটি প্রতিনিধিত্ব করতে পারে বা নাও করতে পারে এবং অন্যটি সাফল্যের প্রতিনিধিত্ব করতে পারে বা নাও করতে পারে, তবে এটি অনেকেরই একমাত্র সম্ভাব্য ব্যবহারের ক্ষেত্রে। Eitherএর চেয়ে অনেক বেশি সাধারণ। আপনার ঠিক তেমনই একটি পদ্ধতি থাকতে পারে যা ব্যবহারকারীর কাছ থেকে ইনপুট পড়তে পারে যাকে হয় নাম লেখার অনুমতি দেওয়া হয় বা তারিখ ফেরত দেওয়া হয় Either[String, Date]

অথবা, সি-তে ল্যাম্বডা লিটারালগুলি সম্পর্কে ভাবেন: তারা হয় কোনও Funcবা একটিকে মূল্যায়ন করে Expression, অর্থাত তারা কোনও বেনামে ফাংশনটি মূল্যায়ন করেন বা তারা এএসটির কাছে মূল্যায়ন করে। সি-তে, এটি "ম্যাজিকালি" হয়, তবে আপনি যদি এটির জন্য একটি সঠিক ধরণ দিতে চান, এটি হবে Either<Func<T1, T2, …, R>, Expression<T1, T2, …, R>>। তবে দুটি বিকল্পের কোনওটিই একটি ত্রুটি নয় এবং দুটির একটিও হয় "স্বাভাবিক" বা "ব্যতিক্রমী" নয়। এগুলি কেবল দুটি ভিন্ন ধরণের যা একই ফাংশন থেকে ফিরে আসতে পারে (বা এই ক্ষেত্রে একই আক্ষরিক হিসাবে চিহ্নিত)। [দ্রষ্টব্য: প্রকৃতপক্ষে, Funcআরও দুটি ক্ষেত্রে বিভক্ত হতে হবে, কারণ সি'র কোনও Unitপ্রকার নেই, এবং যাতে কোনও কিছু ফিরে আসে না এমন কিছু উপস্থাপন করা যায় না যা কিছু ফেরত দেয়,Either<Either<Func<T1, T2, …, R>, Action<T1, T2, …>>, Expression<T1, T2, …, R>>

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

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

এটা দিয়ে ব্যতিক্রম ব্যবহার তুলনা করতে আরো অনেক কিছু জ্ঞান করে তোলে Tryসঙ্গে তুলনায় Either

সুতরাং, এটি কারণ # 1 কেন Eitherপরীক্ষা করা ব্যতিক্রমগুলির উপরে ব্যবহৃত হতে পারে: Eitherব্যতিক্রমগুলির তুলনায় অনেক বেশি সাধারণ। এটি এমন ক্ষেত্রে ব্যবহার করা যেতে পারে যেখানে ব্যতিক্রমগুলি এমনকি প্রয়োগ হয় না।

যাইহোক, আপনি সম্ভবত সীমাবদ্ধ কেস সম্পর্কে জিজ্ঞাসা করেছিলেন যেখানে আপনি কেবল ব্যতিক্রমগুলির প্রতিস্থাপন হিসাবে Either(বা আরও বেশি সম্ভবত Try) ব্যবহার করেন। সেক্ষেত্রে এখনও কিছু সুবিধা রয়েছে বা ভিন্ন ভিন্ন পদ্ধতির সম্ভাবনা রয়েছে।

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

ব্যাতিক্রমের শব্দার্থ ভাষায় কঠোরভাবে লেখা হয়। উদাহরণস্বরূপ, স্কালায় ব্যতিক্রমগুলি স্ট্যাকটি উন্মুক্ত করে। যদি আপনি তাদের কোনও ব্যতিক্রম হ্যান্ডলারের কাছে বুদবুদ হতে দেন তবে হ্যান্ডলারটি যেখানে ঘটেছিল সেখানে নেমে ফিরে এটি ঠিক করতে পারে না। OTOH, যদি আপনি এটি সরিয়ে আনার আগে এবং স্ট্যাকের এটি ঠিক করার জন্য প্রয়োজনীয় প্রসঙ্গটি ধ্বংস করার আগে এটি নীচে ধরে ফেলেন তবে আপনি কীভাবে এগিয়ে যেতে চান সে সম্পর্কে কোনও অবগত সিদ্ধান্ত নিতে খুব কম স্তরের একটি অংশে থাকতে পারেন।

এটি স্মলটকের ক্ষেত্রে পৃথক, উদাহরণস্বরূপ, যেখানে ব্যতিক্রমগুলি স্ট্যাকটি উন্মুক্ত করে না এবং পুনরায় শুরুযোগ্য হয় এবং আপনি ব্যতিক্রমটিকে স্ট্যাকের মধ্যে উচ্চতর আপটি ধরতে পারেন (সম্ভবত ডিবাগারের মতো উচ্চতর), ত্রুটিটি স্থির করুন waaaaayyyyy নীচে স্ট্যাক এবং সেখান থেকে কার্যকর পুনরায় শুরু। বা কমনলিস্প শর্তাবলী যেখানে উত্থাপন, ধরা এবং পরিচালনা ব্যতিক্রম ব্যতীত দুটি (উত্থাপন এবং ধরা-পরিচালনা) এর পরিবর্তে তিনটি ভিন্ন জিনিস।

একটি ব্যতিক্রমের পরিবর্তে প্রকৃত ত্রুটি রিটার্ন টাইপ ব্যবহার আপনাকে ভাষা পরিবর্তন না করেই অনুরূপ কিছু করতে এবং আরও অনেক কিছু করতে দেয়।

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


উত্তরটি পছন্দ করুন, যদিও আমি এখনও দেখতে পাচ্ছি না কেন আমি Exceptionএস। Eitherএকটি দুর্দান্ত সরঞ্জামের মতো মনে হচ্ছে তবে হ্যাঁ, আমি ব্যর্থতাগুলি হ্যান্ডল করার বিষয়ে বিশেষভাবে জিজ্ঞাসা করছি এবং আমি আমার কার্যক্ষেত্রে সর্বশক্তিমানের চেয়ে অনেক বেশি নির্দিষ্ট সরঞ্জামটি ব্যবহার করব। ব্যর্থতা হ্যান্ডলিং উল্লেখ করা একটি ন্যায্য যুক্তি, কিন্তু যদি কেউ এই মুহুর্তে এটি পরিচালনা না করতে চান তবে কেবল Tryএকটি নিক্ষেপ পদ্ধতিতে ব্যবহার করতে পারেন Exception। স্ট্যাক-ট্রেস unwinding না প্রভাবিত Either/ Tryপাশাপাশি? ভুল প্রচারের সময় আপনি একই ভুলগুলি পুনরাবৃত্তি করতে পারেন; ব্যর্থতা কখন পরিচালনা করতে হবে তা জানা উভয় ক্ষেত্রেই তুচ্ছ নয়।
আইয়াল রথ

এবং আমি "বিশুদ্ধভাবে কার্যকরী" যুক্তি দিয়ে আসলেই তর্ক করতে পারি না, তাই না?
আইয়াল রথ

0

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

জীবনকে সহজ করার জন্য বাম আইটেমগুলির মোড়কের চরিত্রে অভিনয় Tryকরে স্ক্যালাল পরিবেশে এটিই আসল উপযোগিতা Throwable


2
আমি আপনার বক্তব্য বুঝতে পারি না।
ইয়াল রথ

Eitherস্টাইলের সমস্যা রয়েছে কারণ এটি সত্যিকারের মনড (?) নয়; এর স্বেচ্ছাচার leftমান পেল উচ্চতর মান থেকে দূরে যখন আপনি একটি সঠিক কাঠামো ব্যতিক্রমী অবস্থার সম্পর্কে সঠিকভাবে ঘিরা তথ্য যোগ করেছি। সুতরাং Eitherএক ক্ষেত্রে বাম দিকে স্ট্রিং রিটার্নের ব্যবহারের তুলনা করা , try/catchঅন্য ক্ষেত্রে যথাযথভাবে টাইপ Throwables করা ব্যবহার করা ঠিক নয়। Throwablesতথ্য সরবরাহের মূল্য এবং সংক্ষিপ্ত পদ্ধতি যা Tryপরিচালনা করে Throwables, TryEithertry/catch
সেগুলির

আমি আসলে নিয়ে উদ্বিগ্ন নই try-catch। প্রশ্নে যেমনটি বলেছিলেন যে উত্তরোত্তরটি আমার কাছে অনেক পরিস্কার দেখাচ্ছে এবং ব্যর্থতা হ্যান্ডলিং করা কোড (হয় হয় তেমন প্যাটার্ন-ম্যাচিং বা ট্রাই-ক্যাচ উভয় ক্ষেত্রেই) বেশ পরিষ্কার।
ইয়াল রথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.