সহজ উত্তরটি হ'ল, যখনই কোনও অপারেশন অসম্ভব (তখনই অ্যাপ্লিকেশন বা কারণ এটি ব্যবসায়িক যুক্তি লঙ্ঘন করবে)। যদি কোনও পদ্ধতি আহ্বান করা হয় এবং পদ্ধতিটি কী করতে লেখা ছিল তা করা অসম্ভব, তবে একটি ব্যতিক্রম ছুঁড়ে দিন। একটি ভাল উদাহরণ হ'ল কনস্ট্রাক্টররা সর্বদা আরগমেন্টএক্সেপশন ফেলে দেয় যদি সরবরাহিত পরামিতিগুলি ব্যবহার করে কোনও উদাহরণ তৈরি করা যায় না। অন্য উদাহরণটি অবৈধ অপারেশন এক্সসেপশন, যা অন্য কোনও সদস্য বা শ্রেণীর সদস্যদের অবস্থার কারণে কোনও অপারেশন করা সম্ভব না হলে ছুঁড়ে দেওয়া হয়।
আপনার ক্ষেত্রে, যদি লগইন (ব্যবহারকারীর নাম, পাসওয়ার্ড) এর মতো কোনও পদ্ধতির অনুরোধ করা হয়, যদি ব্যবহারকারীর নামটি বৈধ না হয় তবে পাসওয়ার্ডটি ভুল হলে একটি ব্যবহারকারীর নাম নটভালিডেক্সপশন, বা পাসওয়ার্ডনটক্র্যাক্ট এক্সসেপশন নিক্ষেপ করা সঠিক। সরবরাহকারী প্যারামিটার ব্যবহার করে ব্যবহারকারী লগ ইন করতে পারবেন না (যেমন এটি অসম্ভব কারণ এটি প্রমাণীকরণ লঙ্ঘন করবে), সুতরাং একটি ব্যতিক্রম ছুঁড়ে দিন। যদিও আপনার দুটি ব্যতিক্রম আমি আর্গুমেন্টএক্সসেপশন থেকে উত্তরাধিকারী হতে পারি।
এই কথাটি বলার পরেও, আপনি যদি কোনও ব্যতিক্রম না ছুঁড়তে চান কারণ লগইন ব্যর্থতা খুব সাধারণ হতে পারে, তবে একটি কৌশল হ'ল এমন একটি পদ্ধতি তৈরি করা যা বিভিন্ন ব্যর্থতার প্রতিনিধিত্ব করে এমন প্রকারগুলি ফেরত দেয়। এখানে একটি উদাহরণ:
{ // class
...
public LoginResult Login(string user, string password)
{
if (IsInvalidUser(user))
{
return new UserInvalidLoginResult(user);
}
else if (IsInvalidPassword(user, password))
{
return new PasswordInvalidLoginResult(user, password);
}
else
{
return new SuccessfulLoginResult();
}
}
...
}
public abstract class LoginResult
{
public readonly string Message;
protected LoginResult(string message)
{
this.Message = message;
}
}
public class SuccessfulLoginResult : LoginResult
{
public SucccessfulLogin(string user)
: base(string.Format("Login for user '{0}' was successful.", user))
{ }
}
public class UserInvalidLoginResult : LoginResult
{
public UserInvalidLoginResult(string user)
: base(string.Format("The username '{0}' is invalid.", user))
{ }
}
public class PasswordInvalidLoginResult : LoginResult
{
public PasswordInvalidLoginResult(string password, string user)
: base(string.Format("The password '{0}' for username '{0}' is invalid.", password, user))
{ }
}
বেশিরভাগ বিকাশকারীদের ওভারহেড ছুঁড়ে দেওয়ার কারণে ব্যতিক্রমগুলি এড়াতে শেখানো হয়। এটি উত্স-সচেতন হতে দুর্দান্ত, তবে সাধারণত আপনার অ্যাপ্লিকেশন ডিজাইনের ব্যয় হয় না। সম্ভবত এই কারণেই আপনাকে বলা হয়েছিল যে আপনার দুটি ব্যতিক্রম ছুঁড়ে না ফেলে। ব্যতিক্রমগুলি ব্যবহার করবেন কি না তা সাধারণত ব্যতিক্রমটি ঘন ঘন ঘন ঘন ঘন ঘন হয়ে আসে bo যদি এটি মোটামুটি সাধারণ বা মোটামুটি প্রত্যাশিত ফলাফল হয় তবে এটি তখন হয় যখন বেশিরভাগ বিকাশকারী ব্যতিক্রমগুলি এড়াতে এবং পরিবর্তে ব্যর্থতা চিহ্নিত করার জন্য অন্য পদ্ধতি তৈরি করবে, কারণ সম্পদগুলির অনুমিত খরচ হিসাবে।
চেষ্টা () প্যাটার্নটি ব্যবহার করে যেমন বর্ণিত হয়েছে ঠিক তেমন একটি দৃশ্যে ব্যতিক্রমগুলি ব্যবহার এড়ানোর উদাহরণ এখানে:
public class ValidatedLogin
{
public readonly string User;
public readonly string Password;
public ValidatedLogin(string user, string password)
{
if (IsInvalidUser(user))
{
throw new UserInvalidException(user);
}
else if (IsInvalidPassword(user, password))
{
throw new PasswordInvalidException(password);
}
this.User = user;
this.Password = password;
}
public static bool TryCreate(string user, string password, out ValidatedLogin validatedLogin)
{
if (IsInvalidUser(user) ||
IsInvalidPassword(user, password))
{
return false;
}
validatedLogin = new ValidatedLogin(user, password);
return true;
}
}