অনবরত চেষ্টা! & চেষ্টা? পার্থক্য কী এবং কখন ব্যবহার করতে হবে?


172

ইন সুইফট 2.0 অ্যাপল ত্রুটি (do-চেষ্টা-ধরা) হ্যান্ডেল করার একটি নতুন উপায় পরিচয় করিয়ে দেন। এবং কিছু দিন আগে বিটা 6-তে একটি আরও নতুন কীওয়ার্ড চালু হয়েছিল ( try?)। এছাড়াও, জানতাম যে আমি ব্যবহার করতে পারি try!। 3 টি কীওয়ার্ডের মধ্যে পার্থক্য কী এবং কখন ব্যবহার করতে হবে?

উত্তর:


316

সুইফ্ট 5.1 এর জন্য আপডেট হয়েছে

নিম্নলিখিত নিক্ষেপ ফাংশন অনুমান:

enum ThrowableError: Error {

    case badError(howBad: Int)
}

func doSomething(everythingIsFine: Bool = false) throws -> String {

  if everythingIsFine {
      return "Everything is ok"
  } else {
      throw ThrowableError.badError(howBad: 4)
  }
}

চেষ্টা

আপনি ফেলতে পারে এমন কোনও ফাংশন কল করার চেষ্টা করার সময় আপনার কাছে দুটি বিকল্প রয়েছে।

ডু -ক্যাচ ব্লকের মধ্যে আপনার কলকে ঘিরে ত্রুটিগুলি সামলানোর দায়িত্ব আপনি নিতে পারেন :

do {
    let result = try doSomething()
}
catch ThrowableError.badError(let howBad) {
    // Here you know about the error
    // Feel free to handle or to re-throw

    // 1. Handle
    print("Bad Error (How Bad Level: \(howBad)")

    // 2. Re-throw
    throw ThrowableError.badError(howBad: howBad)
}

বা কেবল ফাংশনটি কল করার চেষ্টা করুন, এবং ত্রুটিটি কল চেইনের পরবর্তী কলারের কাছে দিয়ে দিন:

func doSomeOtherThing() throws -> Void {    
    // Not within a do-catch block.
    // Any errors will be re-thrown to callers.
    let result = try doSomething()
}

চেষ্টা করুন!

আপনি যখন কোনও অনূদিত withচ্ছিকভাবে এটির অভ্যন্তরে প্রবেশের চেষ্টা করবেন তখন কী হবে? হ্যাঁ, সত্য, অ্যাপটি ক্র্যাশ করবে! একই চেষ্টা করে যায়! এটি মূলত ত্রুটি শৃঙ্খলা উপেক্ষা করে এবং একটি "কর বা মরা" পরিস্থিতি ঘোষণা করে। যদি ডাকা ফাংশনটি কোনও ত্রুটি না ফেলে তবে সবকিছু ঠিকঠাক হয়ে যায়। তবে যদি এটি ব্যর্থ হয় এবং কোনও ত্রুটি ছুঁড়ে ফেলে তবে আপনার অ্যাপ্লিকেশনটি কেবল ক্রাশ হবে

let result = try! doSomething() // if an error was thrown, CRASH!

চেষ্টা?

এক্সকোড bet বিটা in এ প্রবর্তিত একটি নতুন কীওয়ার্ড এটি একটি alচ্ছিক দেয় যা সফল মানগুলি আবরণ করে এবং শূন্যতায় ফিরে ত্রুটি ধরা দেয়।

if let result = try? doSomething() {
    // doSomething succeeded, and result is unwrapped.
} else {
    // Ouch, doSomething() threw an error.
}

অথবা আমরা গার্ড ব্যবহার করতে পারি:

guard let result = try? doSomething() else {
    // Ouch, doSomething() threw an error.
}
// doSomething succeeded, and result is unwrapped.

এখানে একটি চূড়ান্ত নোট, try?নোটটি ব্যবহার করে আপনি যে ত্রুটিটি ঘটেছে তা এড়িয়ে যাচ্ছেন, কারণ এটি কোনও শূন্য হিসাবে অনুবাদ করা হয়েছে। চেষ্টা করবেন? আপনি যখন সাফল্য এবং ব্যর্থতার দিকে বেশি মনোযোগ দিচ্ছেন, কেন বিষয়গুলি ব্যর্থ হয়েছে তা নয়।

কোলেসিং অপারেটর ব্যবহার করছেন ??

আপনি Coalescing অপারেটর ব্যবহার করতে পারেন ?? চেষ্টা করে? ব্যর্থতার ক্ষেত্রে একটি ডিফল্ট মান সরবরাহ করতে:

let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value

আপনার দ্বিতীয় কোডের নমুনা ( let result = try doSomething() // Not within a do-catch block) ঠিক এমনভাবে ঘোষণা করা কোনও পদ্ধতির মধ্যে থেকে কল করা উচিত throws? সুতরাং, যদি doSomething()ব্যর্থ হয়, তাহলে বাহ্যিক পদ্ধতিটিও (পরিবর্তে) হয়?
নিকোলাস মিয়ারি

পুরানো থ্রেড এবং সমস্তটিই আমি খুঁজে পেয়েছি যে আজ (সুইফট 4, এক্সকোড 9.1) চেষ্টা করছেন? ফলাফলটি স্বয়ংক্রিয়ভাবে মোড়ানো হবে না। এটি ম্যানুয়ালি আনপ্রেপ করার জন্য এটি কেবলমাত্র সাধারণ বিকল্প হিসাবে ছেড়ে দেয়। এটি সুইফট 2/3 থেকে পরিবর্তিত হয়েছে কিনা তা নিশ্চিত নন তবে এটি ডক্স অনুসারে: ডেভেলপার.এপ্লে / লাইবারি / কনটেন্ট / ডকুমেন্টেশন / সুইফট / (( ত্রুটিগুলি ptionচ্ছিক মানগুলিতে রূপান্তরিত দেখুন )। বিটিডব্লিউ চেষ্টা করার দুর্দান্ত ব্যাখ্যা।
the_dude_abides

1
দ্রুত 4 এ, চেষ্টা? আমার প্রকল্পে 'চেষ্টা' এক্সপ্রেশনগুলির মধ্যে থ্রোংয়ে ফাংশনগুলির কোনও কলগুলি সরিয়ে দেয় না।
আজ্নলাইট 89

7
এছাড়াও আপনি ব্যবহার করতে পারে try?সঙ্গে ??তাই এটা আপনি এক লাইনে ডিফল্ট মান নির্ধারণ করা যাক হবে:let something:String = (try? whateverIfItThrows()) ?? "Your default value here"
itMaxence
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.