আমি সুইফটে খুব বেশি পড়িনি তবে একটি জিনিস আমি লক্ষ্য করেছি যে এর ব্যতিক্রম নেই। তাহলে তারা কীভাবে সুইফটে পরিচালনা করতে ত্রুটি করবেন? ত্রুটি-পরিচালনা সম্পর্কিত কেউ কি কিছু পেয়েছেন?
আমি সুইফটে খুব বেশি পড়িনি তবে একটি জিনিস আমি লক্ষ্য করেছি যে এর ব্যতিক্রম নেই। তাহলে তারা কীভাবে সুইফটে পরিচালনা করতে ত্রুটি করবেন? ত্রুটি-পরিচালনা সম্পর্কিত কেউ কি কিছু পেয়েছেন?
উত্তর:
সুইফট ২-এ নতুন কিছু ত্রুটি-হ্যান্ডলিং ব্যবস্থা রয়েছে বলে কিছু পরিবর্তন হয়েছে, এটি ব্যতিক্রমগুলির সাথে কিছুটা বেশি মিলছে তবে বিস্তারিতভাবে ভিন্ন।
যদি ফাংশন / পদ্ধতিটি এটি একটি ত্রুটি ছুঁড়ে দিতে পারে তা নির্দেশ করতে চায় তবে এতে throws
কীওয়ার্ড থাকা উচিত
func summonDefaultDragon() throws -> Dragon
দ্রষ্টব্য: ফাংশনটি আসলে ফেলে দিতে পারে এমন ধরণের ত্রুটির কোনও নির্দিষ্টকরণ নেই। এই ঘোষণাটি সহজভাবে জানিয়েছে যে ফাংশনটি কোনও ধরণের ত্রুটি টাইপ প্রয়োগের উদাহরণ ফেলতে পারে বা একেবারেই নিক্ষেপ করছে না।
ক্রিয়াকলাপটি চালনার জন্য আপনার এই জাতীয় চেষ্টা করে চেষ্টা করুন
try summonDefaultDragon()
এই লাইনে সাধারণত ডু-ক্যাচ ব্লক উপস্থিত থাকতে হবে
do {
let dragon = try summonDefaultDragon()
} catch DragonError.dragonIsMissing {
// Some specific-case error-handling
} catch DragonError.notEnoughMana(let manaRequired) {
// Other specific-case error-handlng
} catch {
// Catch all error-handling
}
দ্রষ্টব্য: ক্যাচ ক্লজটি সুইফ্ট প্যাটার্নের মিলের সমস্ত শক্তিশালী বৈশিষ্ট্য ব্যবহার করে যাতে আপনি এখানে খুব নমনীয়।
আপনি throws
কীওয়ার্ডের সাহায্যে চিহ্নিত হওয়া কোনও ফাংশন থেকে কোনও নিক্ষেপ ফাংশনটি কল করে যদি আপনি ত্রুটিটি প্রচার করার সিদ্ধান্ত নিতে পারেন :
func fulfill(quest: Quest) throws {
let dragon = try summonDefaultDragon()
quest.ride(dragon)
}
বিকল্পভাবে, আপনি ব্যবহার করে নিক্ষেপ ফাংশন কল করতে পারেন try?
:
let dragonOrNil = try? summonDefaultDragon()
এইভাবে আপনি যদি কোনও ত্রুটি ঘটে থাকে তবে আপনি রিটার্ন মান বা শূন্য পাবেন। এইভাবে ব্যবহার করে আপনি ত্রুটিযুক্ত জিনিসটি পাবেন না।
যার অর্থ হল আপনি try?
দরকারী বিবৃতিগুলির সাথে একত্রিত করতে পারেন যেমন:
if let dragon = try? summonDefaultDragon()
অথবা
guard let dragon = try? summonDefaultDragon() else { ... }
অবশেষে, আপনি সিদ্ধান্ত নিতে পারেন যে আপনি জানেন যে ত্রুটিটি আসলে ঘটবে না (যেমন আপনি ইতিমধ্যে যাচাই করেছেন পূর্বশর্তগুলি) এবং try!
কীওয়ার্ডটি ব্যবহার করুন :
let dragon = try! summonDefaultDragon()
যদি ফাংশনটি আসলে ত্রুটি ছুড়ে দেয় তবে আপনি আপনার অ্যাপ্লিকেশনটিতে একটি রানটাইম ত্রুটি পাবেন এবং অ্যাপ্লিকেশনটি সমাপ্ত হবে।
কোনও ত্রুটি ছুঁড়ে ফেলার জন্য আপনি এই জাতীয় থ্রো কীওয়ার্ডটি ব্যবহার করেন
throw DragonError.dragonIsMissing
ErrorType
প্রোটোকলের সাথে সঙ্গতিপূর্ণ এমন কোনও কিছু আপনি ফেলে দিতে পারেন । প্রারম্ভিকদের NSError
জন্য এই প্রোটোকলটির সাথে সঙ্গতিপূর্ণ তবে আপনি সম্ভবত এনাম-বেসডের সাথে যেতে চান ErrorType
যা আপনাকে একাধিক সম্পর্কিত ত্রুটিগুলি গোষ্ঠী করতে সক্ষম করে, সম্ভাব্যত এই অতিরিক্ত ডেটার টুকরা সহ
enum DragonError: ErrorType {
case dragonIsMissing
case notEnoughMana(requiredMana: Int)
...
}
নতুন সুইফট 2 এবং 3 ত্রুটি প্রক্রিয়া এবং জাভা / সি # / সি ++ শৈলিক ব্যতিক্রমগুলির মধ্যে প্রধান পার্থক্যগুলি নিম্নলিখিত:
do-catch
+ + try
+ + defer
ঐতিহ্যগত বনাম try-catch-finally
সিনট্যাক্স।do-catch
ব্লকটি কোনও এনএসইসিপশন ধরবে না এবং বিপরীতে এটির জন্য আপনাকে অবশ্যই ওজেজেসি ব্যবহার করতে হবে।NSError
ফিরতি false
( Bool
ফাংশন প্রত্যাবর্তনের জন্য ) বা nil
( AnyObject
ফাংশন ফিরিয়ে দেওয়ার জন্য ) এবং NSErrorPointer
ত্রুটির বিবরণ সহকারে পাস করার কোকো পদ্ধতি প্রচলনের সাথে সামঞ্জস্যপূর্ণ ।ত্রুটি পরিচালনা করা সহজ করার জন্য অতিরিক্ত সিনট্যাটিক-চিনি হিসাবে, আরও দুটি ধারণা রয়েছে
defer
কীওয়ার্ড ব্যবহার করে ) যা আপনাকে জাভা / সি # / ইত্যাদিতে অবশেষে ব্লকগুলির মতো একই প্রভাব অর্জন করতে দেয়guard
কীওয়ার্ড ব্যবহার করে ) যা আপনাকে / অন্য কোডে সাধারণ ত্রুটি পরীক্ষার / সিগন্যালিং কোডের চেয়ে কম কোড লিখতে দেয়।রানটাইম ত্রুটি:
লেয়ানড্রস যেমন রানটাইম ত্রুটিগুলি পরিচালনা করার জন্য পরামর্শ দেয় (যেমন নেটওয়ার্ক সংযোগ সমস্যা, ডেটা পার্সিং, ফাইল খোলার ইত্যাদি) আপনার NSError
যেমন ওবজেসি-তে করা উচিত, কারণ ফাউন্ডেশন, অ্যাপকিট, ইউআইকিট ইত্যাদি তাদের ত্রুটিগুলি এভাবে রিপোর্ট করে। সুতরাং এটি ভাষা জিনিস চেয়ে কাঠামোর জিনিস।
আর একটি ঘন ঘন নিদর্শন ব্যবহৃত হচ্ছে যা এএফ নেটওয়ার্কিংয়ের মতো পৃথককারী সাফল্য / ব্যর্থতা ব্লক:
var sessionManager = AFHTTPSessionManager(baseURL: NSURL(string: "yavin4.yavin.planets"))
sessionManager.HEAD("/api/destoryDeathStar", parameters: xwingSquad,
success: { (NSURLSessionDataTask) -> Void in
println("Success")
},
failure:{ (NSURLSessionDataTask, NSError) -> Void in
println("Failure")
})
তবুও ব্যর্থতা ব্লকটি প্রায়শই NSError
ত্রুটিটি বর্ণনা করে উদাহরণ পেয়ে যায় ।
প্রোগ্রামার ত্রুটি:
প্রোগ্রামার ত্রুটির জন্য (অ্যারের উপাদানটির সীমা অতিক্রমের মতো, কোনও ফাংশন কলকে অবৈধ আর্গুমেন্ট প্রেরণ করা ইত্যাদি) আপনি ওবিজিতে ব্যতিক্রম ব্যবহার করেছেন। সুইফট ভাষা ব্যতিক্রম জন্য কোনো ভাষা সমর্থন আছে বলে মনে হচ্ছে না (যেমন throw
, catch
ইত্যাদি শব্দ)। যাইহোক, ডকুমেন্টেশনের পরামর্শ অনুসারে এটি ওজজির মতো একই রানটাইমটিতে চলছে এবং তাই আপনি এখনও NSExceptions
এইরকম নিক্ষেপ করতে সক্ষম হন :
NSException(name: "SomeName", reason: "SomeReason", userInfo: nil).raise()
আপনি কেবল খাঁটি সুইফটে তাদের ধরতে পারবেন না, যদিও আপনি ওজেসি কোডে ব্যতিক্রম ধরা পছন্দ করতে পারেন।
প্রশ্নগুলি হ'ল আপনাকে প্রোগ্রামার ত্রুটির জন্য ব্যতিক্রম ছুঁড়ে ফেলা উচিত, বা পরিবর্তিত ভাষা নির্দেশিকাতে অ্যাপলের পরামর্শ অনুসারে দৃ use়তাগুলি ব্যবহার করা উচিত।
fatalError(...)
পাশাপাশি একই।
আপডেট জুন 9 ই 2015 - খুব গুরুত্বপূর্ণ
সুইফট 2.0 দিয়ে আসে try
, throw
এবং catch
কীওয়ার্ড এবং সবচেয়ে উত্তেজনাপূর্ণ হল:
সুইফট স্বয়ংক্রিয়ভাবে উদ্দেশ্য-সি পদ্ধতিগুলিতে অনুবাদ করে যা পদ্ধতিগুলিতে ত্রুটি তৈরি করে যা সুইফ্টের নেটিভ ত্রুটি হ্যান্ডলিং কার্যকারিতা অনুযায়ী ত্রুটি ফেলে।
দ্রষ্টব্য: যে পদ্ধতিগুলি ত্রুটি গ্রাস করে, যেমন ডেলিগেট পদ্ধতি বা এমন পদ্ধতিগুলি যেগুলি NSError অবজেক্ট আর্গুমেন্টের সাথে একটি সম্পূর্ণতা হ্যান্ডলার গ্রহণ করে, এমন পদ্ধতিতে পরিণত হয় না যা সুইফট দ্বারা আমদানি করার সময় নিক্ষেপ করে।
এর উত্স: অ্যাপল ইনক। "কোকো এবং অবজেক্টিভ-সি (সুইফট 2 প্রিরিলিজ) সহ সুইফ্ট ব্যবহার করা।" iBooks।
উদাহরণ: (বই থেকে)
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *URL = [NSURL fileURLWithPath:@"/path/to/file"];
NSError *error = nil;
BOOL success = [fileManager removeItemAtURL:URL error:&error];
if (!success && error){
NSLog(@"Error: %@", error.domain);
}
দ্রুত সমতুল্য হবে:
let fileManager = NSFileManager.defaultManager()
let URL = NSURL.fileURLWithPath("path/to/file")
do {
try fileManager.removeItemAtURL(URL)
} catch let error as NSError {
print ("Error: \(error.domain)")
}
একটি ত্রুটি নিক্ষেপ করা:
*errorPtr = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCannotOpenFile userInfo: nil]
কলারে স্বয়ংক্রিয়ভাবে প্রচার করা হবে:
throw NSError(domain: NSURLErrorDomain, code: NSURLErrorCannotOpenFile, userInfo: nil)
অ্যাপল বই থেকে, সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে মনে হয় এনুম ব্যবহার করে ত্রুটিগুলি পরিচালনা করা উচিত।
এখানে বইয়ের একটি উদাহরণ রয়েছে।
enum ServerResponse {
case Result(String, String)
case Error(String)
}
let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Error("Out of cheese.")
switch success {
case let .Result(sunrise, sunset):
let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
case let .Error(error):
let serverResponse = "Failure... \(error)"
}
থেকে: অ্যাপল ইনক। "দ্য সুইফ্ট প্রোগ্রামিং ভাষা।" iBooks। https://itun.es/br/jEUH0.l
হালনাগাদ
অ্যাপল নিউজ বইগুলি থেকে, "সুইফট উইথ কোকো এবং অবজেক্টিভ-সি" ব্যবহার করা। সুইফ ভাষা ব্যবহার করে রানটাইম ব্যতিক্রম ঘটে না, তাই আপনার চেষ্টা করে না। পরিবর্তে আপনি ptionচ্ছিক চেইন ব্যবহার করুন ।
এখানে বইয়ের একটি প্রসার রয়েছে:
উদাহরণস্বরূপ, নীচের কোড তালিকায়, প্রথম এবং দ্বিতীয় লাইনগুলি কার্যকর করা হয় না কারণ এনএসডিট অবজেক্টে দৈর্ঘ্যের সম্পত্তি এবং অক্ষরআটিআইডেক্স: পদ্ধতিটি বিদ্যমান নেই। MyLength ধ্রুবকটি একটি alচ্ছিক INT হিসাবে অনুমিত হয়, এবং শূন্য করা হয়েছে। তিনটি লাইনে দেখানো হয়েছে এমন কোনও পদ্ধতির ফলাফল যা শর্ত সাপেক্ষে প্রতিক্রিয়া জানাতে পারে না তার ফলাফলটি শর্তসাপেক্ষে মোড়ক করতে আপনি যদি একটি if statement বিবৃতি ব্যবহার করতে পারেন
let myLength = myObject.length?
let myChar = myObject.characterAtIndex?(5)
if let fifthCharacter = myObject.characterAtIndex(5) {
println("Found \(fifthCharacter) at index 5")
}
এর থেকে অংশ: অ্যাপল ইনক। "কোকো এবং উদ্দেশ্য-সি সহ সুইফ্ট ব্যবহার করা।" iBooks। https://itun.es/br/1u3-0.l
এবং বইগুলি আপনাকে উদ্দেশ্য-সি (এনএসইরর অবজেক্ট) থেকে কোকো ত্রুটি নমুনা ব্যবহার করতে উত্সাহিত করে
Iftচ্ছিক রিটার্ন মান দেওয়ার অতিরিক্ত বেনিফিট সহ সুইফ্টে ত্রুটি জানানো ওজেক্টিভ-সি তে একই ধাঁচ অনুসরণ করে। সর্বাধিক সহজ ক্ষেত্রে, আপনি সফল হয়েছে কি না তা নির্দেশ করার জন্য আপনি ফাংশন থেকে একটি বুল মান ফিরিয়ে দেন। যখন আপনাকে ত্রুটির কারণ জানাতে হবে তখন আপনি এনএসইররর আউট প্যারামিটারটি এনএসইররর পয়েন্টার ফাংশনে যুক্ত করতে পারেন। এই ধরণের অতিরিক্ত মেমরি সুরক্ষা এবং alচ্ছিক টাইপিং সহ অবজেক্টিক-সি এর এনএসইরর ** এর সমান। নীচের কোড তালিকায় যেমন দেখানো হয়েছে তেমন কোনও এনএসইররপয়েন্টার অবজেক্ট হিসাবে alচ্ছিক এনএসইররর প্রকারের প্রসঙ্গে পাস করার জন্য আপনি উপসর্গ এবং অপারেটরটি ব্যবহার করতে পারেন।
var writeError : NSError?
let written = myString.writeToFile(path, atomically: false,
encoding: NSUTF8StringEncoding,
error: &writeError)
if !written {
if let error = writeError {
println("write failure: \(error.localizedDescription)")
}
}
এর থেকে অংশ: অ্যাপল ইনক। "কোকো এবং উদ্দেশ্য-সি সহ সুইফ্ট ব্যবহার করা।" iBooks। https://itun.es/br/1u3-0.l
উদ্দেশ্য-সি এর পদ্ধতির অনুরূপ সুইফটে কোনও ব্যতিক্রম নেই।
বিকাশে, আপনি assert
প্রদর্শিত হতে পারে এমন কোনও ত্রুটি ধরতে ব্যবহার করতে পারেন , এবং উত্পাদনে যাওয়ার আগে এটি সংশোধন করা দরকার।
ক্লাসিক NSError
পদ্ধতির পরিবর্তন করা হয়নি, আপনি একটি প্রেরণ করুন NSErrorPointer
যা জনবহুল হয়।
সংক্ষিপ্ত উদাহরণ:
var error: NSError?
var contents = NSFileManager.defaultManager().contentsOfDirectoryAtPath("/Users/leandros", error: &error)
if let error = error {
println("An error occurred \(error)")
} else {
println("Contents: \(contents)")
}
f();g();
হয়ে যায় f(&err);if(err) return;g(&err);if(err) return;
, তারপরে এটি ঠিক হয়ে যায়f(nil);g(nil);hopeToGetHereAlive();
প্রস্তাবিত 'সুইফট ওয়ে' হ'ল:
func write(path: String)(#error: NSErrorPointer) -> Bool { // Useful to curry error parameter for retrying (see below)!
return "Hello!".writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding, error: error)
}
var writeError: NSError?
let written = write("~/Error1")(error: &writeError)
if !written {
println("write failure 1: \(writeError!.localizedDescription)")
// assert(false) // Terminate program
}
তবে আমি চেষ্টা করা / ধরা পছন্দ করি কারণ এটি অনুসরণ করা সহজ বলে মনে হয় কারণ এটি ত্রুটিটি পরিচালনা করে শেষ পর্যন্ত একটি পৃথক ব্লকে স্থানান্তরিত করে, এই বিন্যাসটিকে কখনও কখনও "গোল্ডেন পাথ" বলা হয়। ভাগ্যবান আপনি ক্লোজার দিয়ে এটি করতে পারেন:
TryBool {
write("~/Error2")(error: $0) // The code to try
}.catch {
println("write failure 2: \($0!.localizedDescription)") // Report failure
// assert(false) // Terminate program
}
এছাড়াও পুনরায় চেষ্টা করার সুবিধা যুক্ত করা সহজ:
TryBool {
write("~/Error3")(error: $0) // The code to try
}.retry {
println("write failure 3 on try \($1 + 1): \($0!.localizedDescription)")
return write("~/Error3r") // The code to retry
}.catch {
println("write failure 3 catch: \($0!.localizedDescription)") // Report failure
// assert(false) // Terminate program
}
ট্রাইবুলের তালিকাটি হ'ল:
class TryBool {
typealias Tryee = NSErrorPointer -> Bool
typealias Catchee = NSError? -> ()
typealias Retryee = (NSError?, UInt) -> Tryee
private var tryee: Tryee
private var retries: UInt = 0
private var retryee: Retryee?
init(tryee: Tryee) {
self.tryee = tryee
}
func retry(retries: UInt, retryee: Retryee) -> Self {
self.retries = retries
self.retryee = retryee
return self
}
func retry(retryee: Retryee) -> Self {
return self.retry(1, retryee)
}
func retry(retries: UInt) -> Self {
// For some reason you can't write the body as "return retry(1, nil)", the compiler doesn't like the nil
self.retries = retries
retryee = nil
return self
}
func retry() -> Self {
return retry(1)
}
func catch(catchee: Catchee) {
var error: NSError?
for numRetries in 0...retries { // First try is retry 0
error = nil
let result = tryee(&error)
if result {
return
} else if numRetries != retries {
if let r = retryee {
tryee = r(error, numRetries)
}
}
}
catchee(error)
}
}
আপনি বুল মানের পরিবর্তে ptionচ্ছিক রিটার্ন মান পরীক্ষা করার জন্য একই শ্রেণি লিখতে পারেন:
class TryOptional<T> {
typealias Tryee = NSErrorPointer -> T?
typealias Catchee = NSError? -> T
typealias Retryee = (NSError?, UInt) -> Tryee
private var tryee: Tryee
private var retries: UInt = 0
private var retryee: Retryee?
init(tryee: Tryee) {
self.tryee = tryee
}
func retry(retries: UInt, retryee: Retryee) -> Self {
self.retries = retries
self.retryee = retryee
return self
}
func retry(retryee: Retryee) -> Self {
return retry(1, retryee)
}
func retry(retries: UInt) -> Self {
// For some reason you can't write the body as "return retry(1, nil)", the compiler doesn't like the nil
self.retries = retries
retryee = nil
return self
}
func retry() -> Self {
return retry(1)
}
func catch(catchee: Catchee) -> T {
var error: NSError?
for numRetries in 0...retries {
error = nil
let result = tryee(&error)
if let r = result {
return r
} else if numRetries != retries {
if let r = retryee {
tryee = r(error, numRetries)
}
}
}
return catchee(error)
}
}
ট্রাইঅપ્শনাল সংস্করণটি একটি অ-ptionচ্ছিক রিটার্ন প্রকার প্রয়োগ করে যা পরবর্তী প্রোগ্রামিংগুলিকে সহজ করে তোলে, যেমন 'সুইফট ওয়ে:
struct FailableInitializer {
init?(_ id: Int, error: NSErrorPointer) {
// Always fails in example
if error != nil {
error.memory = NSError(domain: "", code: id, userInfo: [:])
}
return nil
}
private init() {
// Empty in example
}
static let fallback = FailableInitializer()
}
func failableInitializer(id: Int)(#error: NSErrorPointer) -> FailableInitializer? { // Curry for retry
return FailableInitializer(id, error: error)
}
var failError: NSError?
var failure1Temp = failableInitializer(1)(error: &failError)
if failure1Temp == nil {
println("failableInitializer failure code: \(failError!.code)")
failure1Temp = FailableInitializer.fallback
}
let failure1 = failure1Temp! // Unwrap
ট্রায়োশনাল ব্যবহার করে:
let failure2 = TryOptional {
failableInitializer(2)(error: $0)
}.catch {
println("failableInitializer failure code: \($0!.code)")
return FailableInitializer.fallback
}
let failure3 = TryOptional {
failableInitializer(3)(error: $0)
}.retry {
println("failableInitializer failure, on try \($1 + 1), code: \($0!.code)")
return failableInitializer(31)
}.catch {
println("failableInitializer failure code: \($0!.code)")
return FailableInitializer.fallback
}
স্বতঃ-মোড়ক নোট করুন।
সম্পাদনা করুন: যদিও এই উত্তরটি কার্যকর হয় তবে এটি উদ্দেশ্য-সি এর চেয়ে বেশি সুইফটে রূপান্তরিত। এটি সুইফট ২.০ এর পরিবর্তন করে অচল করে দেওয়া হয়েছে। উপরের গিলহর্মে টরেস কাস্ত্রোর উত্তরটি সুইফটে ত্রুটিগুলি পরিচালনা করার পছন্দের পদ্ধতির খুব ভাল পরিচয়। VOS
এটি বের করার জন্য এটি কিছুটা সময় নিয়েছিল তবে আমি মনে করি এটি সাস করেছি। যদিও এটি কুৎসিত মনে হচ্ছে। উদ্দেশ্য-সি সংস্করণে পাতলা ত্বক ছাড়া আর কিছুই নয়।
একটি এনএসইরর পরামিতি সহ একটি ফাংশন কল করা হচ্ছে ...
var fooError : NSError ? = nil
let someObject = foo(aParam, error:&fooError)
// Check something was returned and look for an error if it wasn't.
if !someObject {
if let error = fooError {
// Handle error
NSLog("This happened: \(error.localizedDescription)")
}
} else {
// Handle success
}`
একটি ত্রুটি প্যারামিটার লাগে এমন ফাংশনটি লেখা হচ্ছে ...
func foo(param:ParamObject, error: NSErrorPointer) -> SomeObject {
// Do stuff...
if somethingBadHasHappened {
if error {
error.memory = NSError(domain: domain, code: code, userInfo: [:])
}
return nil
}
// Do more stuff...
}
উদ্দেশ্য সি এর চারপাশে বেসিক মোড়ক যা আপনাকে চেষ্টা করার বৈশিষ্ট্যটি দেয়। https://github.com/williamFalcon/SwiftTryCatch
এর মতো ব্যবহার করুন:
SwiftTryCatch.try({ () -> Void in
//try something
}, catch: { (error) -> Void in
//handle error
}, finally: { () -> Void in
//close resources
})
এটি সুইফট ২.০ এর আপডেট আপডেট। আমি জাভা এর মতো বৈশিষ্ট্যযুক্ত সমৃদ্ধ ত্রুটি হ্যান্ডলিং মডেলটির অপেক্ষায় রয়েছি। অবশেষে, তারা সুসংবাদটি ঘোষণা করেছিল। এখানে
ত্রুটি পরিচালনা করার মডেল: সুইফট ২.০-তে নতুন ত্রুটি হ্যান্ডলিং মডেলটি তাত্ক্ষণিকভাবে প্রাকৃতিকভাবে অনুভব করবে, পরিচিত চেষ্টা, নিক্ষেপ এবং কীওয়ার্ডগুলি ধরা হবে । সর্বোপরি, এটি অ্যাপল এসডিকে এবং এনএসইররারের সাথে নিখুঁতভাবে কাজ করার জন্য ডিজাইন করা হয়েছিল। আসলে, এনএসইরর একটি সুইফটের ত্রুটি টাইপ অনুসারে কাজ করে। এ সম্পর্কে আরও শুনতে আপনি সুইডটে নতুন কী বিষয়ে ডাব্লুডাব্লুডিসি অধিবেশনটি অবশ্যই দেখতে চাইবেন।
যেমন:
func loadData() throws { }
func test() {
do {
try loadData()
} catch {
print(error)
}}
হিসাবে Guilherme টরেস কাস্ত্রো বলেন, সুইফট 2.0 এ, try
, catch
,do
প্রোগ্রামিং ব্যবহার করা যাবে।
উদাহরণস্বরূপ, কোরেডাটা তথ্য পদ্ধতিটি আনার পরিবর্তে, &error
প্যারামিটার হিসাবে রাখার পরিবর্তে managedContext.executeFetchRequest(fetchRequest, error: &error)
এখন আমাদের কেবল ব্যবহারটি ব্যবহার করতে হবে managedContext.executeFetchRequest(fetchRequest)
এবং তারপরে ত্রুটিটি পরিচালনা করতে হবে try
, catch
( অ্যাপল ডকুমেন্ট লিংক )
do {
let fetchedResults = try managedContext.executeFetchRequest(fetchRequest) as? [NSManagedObject]
if let results = fetchedResults{
people = results
}
} catch {
print("Could not fetch")
}
আপনি যদি ইতিমধ্যে xcode7 বিটা ডাউনলোড করেন। অনুসন্ধান করার চেষ্টা করুন ত্রুটি নিক্ষেপ মধ্যে নথি এবং API রেফারেন্স এবং প্রথম দেখানো ফলাফলের চয়ন, এটি একটি মৌলিক ধারণা কি এই নতুন সিনট্যাক্স জন্য কাজ করা যেতে পারে দেয়। তবে পুরোপুরি ডকুমেন্টেশন এখনও অনেকগুলি এপিআইয়ের জন্য পোস্ট করে না।
আরও অভিনব ত্রুটি পরিচালনার কৌশলগুলি পাওয়া যেতে পারে
সুইফটে নতুন কী আছে (2015 সেশন 106 28m30s)
ত্রুটি সামলানো সুইফট ২.০ এর নতুন বৈশিষ্ট্য। এটি try
, throw
এবং catch
কীওয়ার্ডগুলি ব্যবহার করে ।
অফিসিয়াল অ্যাপল সুইফ্ট ব্লগে অ্যাপল সুইফ্ট 2.0 ঘোষণাটি দেখুন
ব্যতিক্রম হ্যান্ডেল করার জন্য দুর্দান্ত এবং সাধারণ lib: ট্রাইচ্যাচফিনালি-সুইফ্ট
অন্য কয়েকজনের মতো এটি উদ্দেশ্য সি ব্যতিক্রম বৈশিষ্ট্যগুলি জুড়ে দেয়।
এটি এর মতো ব্যবহার করুন:
try {
println(" try")
}.catch { e in
println(" catch")
}.finally {
println(" finally")
}
সুইফট 2 দিয়ে শুরু করে, অন্যরা ইতিমধ্যে উল্লেখ করেছে যে, ত্রুটি পরিচালনার কাজটি কর / চেষ্টা / ধরা এবং ত্রুটি টাইপ এনামগুলির মাধ্যমে সবচেয়ে ভাল করা যায়। এটি সিঙ্ক্রোনাস পদ্ধতিগুলির জন্য বেশ ভাল কাজ করে তবে অ্যাসিঙ্ক্রোনাস ত্রুটি পরিচালনার জন্য একটু চালাকতার প্রয়োজন।
এই নিবন্ধটি এই সমস্যার একটি দুর্দান্ত পদ্ধতির রয়েছে:
https://jeremywsherman.com/blog/2015/06/17/using-swift-throws-with-completion-callbacks/
সংক্ষেপ:
// create a typealias used in completion blocks, for cleaner code
typealias LoadDataResult = () throws -> NSData
// notice the reference to the typealias in the completionHandler
func loadData(someID: String, completionHandler: LoadDataResult -> Void)
{
completionHandler()
}
তারপরে, উপরোক্ত পদ্ধতিতে কলটি নিম্নলিখিতভাবে হবে:
self.loadData("someString",
completionHandler:
{ result: LoadDataResult in
do
{
let data = try result()
// success - go ahead and work with the data
}
catch
{
// failure - look at the error code and handle accordingly
}
})
এটি একটি পৃথক ত্রুটিহীন হ্যান্ডলার কলব্যাক অ্যাসিঙ্ক্রোনাস ফাংশনে পাস হওয়ার চেয়ে কিছুটা পরিচ্ছন্ন বলে মনে হচ্ছে, এটি কীভাবে সুইফট 2-এর আগে পরিচালনা করা হবে।
আমি যা দেখেছি তা হ'ল ডিভাইসের প্রকৃতির কারণে আপনি ব্যবহারকারীর কাছে বার্তা হ্যান্ডলিংয়ের গুচ্ছটি ছুঁড়ে ফেলতে চান না। এজন্য বেশিরভাগ ফাংশন alচ্ছিক মানগুলি ফেরত দেয় তবে thenচ্ছিক উপেক্ষা করার জন্য আপনি কেবল কোড করেন। যদি কোনও ফাংশন ফিরে আসে তবে এর অর্থ ব্যর্থ হয় আপনি কোনও বার্তা বা যা কিছু পপ করতে পারেন।