সুইফটে ঘোষিত throws
কোনও ফাংশন কল করার সময়, আপনাকে অবশ্যই সাথে try
বা এর সাথে ফাংশন কল সাইটটি বেনিফিট করতে হবে try!
। উদাহরণস্বরূপ, একটি নিক্ষেপ ফাংশন দেওয়া:
func willOnlyThrowIfTrue(value: Bool) throws {
if value { throw someError }
}
এই ফাংশনটি বলা যেতে পারে:
func foo(value: Bool) throws {
try willOnlyThrowIfTrue(value)
}
এখানে আমরা কলটির সাথে এ্যানোটেট করি try
, যা পাঠককে কল করে যে এই ফাংশনটি একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে, এবং নিম্নলিখিত কোডের কোনও লাইন কার্যকর করা হবে না। আমাদের সাথে throws
এই ফাংশনটিও বর্জন করতে হবে , কারণ এই ফাংশনটি একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে (অর্থাত্ যখন willOnlyThrowIfTrue()
নিক্ষেপ করে, তখন foo
স্বয়ংক্রিয়ভাবে ব্যতিক্রমটিকে উপরের দিকে পুনর্বিবেচনা করবে)।
আপনি যদি এমন কোনও ফাংশন কল করতে চান যা সম্ভবত নিক্ষেপ হিসাবে ঘোষণা করা হয়েছে তবে আপনি জানেন যা আপনার ক্ষেত্রে ফেলবে না কারণ আপনি এটি সঠিক ইনপুট দিচ্ছেন, আপনি ব্যবহার করতে পারেন try!
।
func bar() {
try! willOnlyThrowIfTrue(false)
}
এইভাবে, যখন আপনি গ্যারান্টি দেন যে কোডটি নিক্ষেপ করবে না, তখন আপনাকে ব্যতিক্রম প্রচারগুলি অক্ষম করতে অতিরিক্ত বয়লারপ্লেট কোড লাগাতে হবে না।
try!
রানটাইমে প্রয়োগ করা হয়: আপনি যদি ব্যবহার করেন try!
এবং ফাংশনটি নিক্ষেপ শেষ করে না, তবে আপনার প্রোগ্রামের সম্পাদনা রানটাইম ত্রুটির সাথে সমাপ্ত হবে।
বেশিরভাগ ব্যতিক্রম হ্যান্ডলিং কোডটি উপরের মতো হওয়া উচিত: হয় ব্যতিক্রমগুলি ঘটে গেলে আপনি কেবল তার উপরের দিকে propagর্ধ্বমুখী প্রচার করেন বা আপনি এমন শর্ত সেট করেন যা অন্যথায় সম্ভাব্য ব্যতিক্রমগুলি বাতিল হয়ে যায়। আপনার কোডে অন্য সংস্থানসমূহের যে কোনও ক্লিন আপ হ'ল অবজেক্ট ধ্বংস (যেমন deinit()
) বা কখনও কখনও defer
এড কোডের মাধ্যমে হওয়া উচিত ।
func baz(value: Bool) throws {
var filePath = NSBundle.mainBundle().pathForResource("theFile", ofType:"txt")
var data = NSData(contentsOfFile:filePath)
try willOnlyThrowIfTrue(value)
// data and filePath automatically cleaned up, even when an exception occurs.
}
যদি কোনও কারণে আপনার ক্লিন আপ কোড রয়েছে যা চালানো দরকার তবে কোনও deinit()
ফাংশনে নেই, আপনি ব্যবহার করতে পারেন defer
।
func qux(value: Bool) throws {
defer {
print("this code runs when the function exits, even when it exits by an exception")
}
try willOnlyThrowIfTrue(value)
}
ব্যতিক্রমগুলির সাথে সম্পর্কিত বেশিরভাগ কোডগুলিতে কেবল তারা কলারের কাছে wardর্ধ্বমুখী প্রচার করে, পথে deinit()
বা মাধ্যমে ক্লিনআপ করেdefer
। এটি কারণ বেশিরভাগ কোড ত্রুটিগুলি সহ কী করতে জানে না; এটি কী ভুল হয়েছে তা জানে, তবে ত্রুটি সম্পর্কে কী করা উচিত তা জানতে কিছু উচ্চ স্তরের কোড কী করার চেষ্টা করছে সে সম্পর্কে এর পর্যাপ্ত তথ্য নেই। এটি ব্যবহারকারীর কাছে একটি ডায়ালগ উপস্থাপন করা উপযুক্ত কিনা, বা এটি আবার চেষ্টা করা উচিত, বা অন্য কোনও কিছু উপযুক্ত কিনা তা জানা যায় না।
উচ্চ স্তরের কোডটি অবশ্য কোনও ত্রুটির ঘটনায় ঠিক কী করা উচিত তা জানা উচিত। সুতরাং ব্যতিক্রমগুলি নির্দিষ্ট ত্রুটিগুলি বুদবুদ করার অনুমতি দেয় যেখানে সেগুলি প্রথমে যেখানে পরিচালনা করা যায় সেখানে ঘটে occur
catch
বিবৃতিগুলির মাধ্যমে ব্যতিক্রমগুলি পরিচালনা করা হয় ।
func quux(value: Bool) {
do {
try willOnlyThrowIfTrue(value)
} catch {
// handle error
}
}
আপনার একাধিক ক্যাচ স্টেটমেন্ট থাকতে পারে, প্রতিটি একেক ধরণের ব্যতিক্রম ing
do {
try someFunctionThatThowsDifferentExceptions()
} catch MyErrorType.errorA {
// handle errorA
} catch MyErrorType.errorB {
// handle errorB
} catch {
// handle other errors
}
ব্যতিক্রমসহ সর্বোত্তম কার্যাভ্যাস আরও বিশদের জন্য, দেখুন http://exceptionsafecode.com/ । এটি বিশেষত সি ++ এর লক্ষ্য, তবে সুইফট ব্যতিক্রম মডেলটি পরীক্ষা করার পরে, আমি বিশ্বাস করি যে বেসিকগুলি সুইফটেও প্রযোজ্য।
সুইফট সিনট্যাক্স এবং ত্রুটি পরিচালনার মডেল সম্পর্কে বিশদের জন্য দ্য সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ (সুইফট 2 প্রিরিলিজ) বইটি দেখুন ।