আসলে এনএসএসার্টের কথাটি কী?


155

আমাকে এটি জিজ্ঞাসা করতে হবে, কারণ: আমি কেবল স্বীকৃত জিনিসটি হ'ল যদি দৃ as়তা ব্যর্থ হয় তবে অ্যাপটি ক্র্যাশ হয়ে যায়। এনএসএসার্ট ব্যবহার করার কারণেই কি এটি? বা এর আর কী লাভ? এবং আমি কোডে করা কোনও অনুমানের ঠিক উপরে NSAssert স্থাপন করা ঠিক কি এমন কোনও ফাংশনের মতো যা কখনও পরম হিসাবে -1 পাওয়া না গেলেও -0.9 বা -1.1 পেতে পারে?

উত্তর:


300

জোড় হ'ল এটি নিশ্চিত করা হয় যে মানটি যা অনুমান করা উচিত is যদি কোনও দৃ f়তা ব্যর্থ হয় তবে এর অর্থ কিছু ভুল হয়েছে এবং তাই অ্যাপটি প্রস্থান করে। দৃsert়তা ব্যবহারের একটি কারণ হ'ল যদি আপনার এমন কিছু ফাংশন থাকে যা আচরণ করবে না বা খুব খারাপ পার্শ্ব প্রতিক্রিয়া তৈরি করবে যদি এতে পাস হওয়া প্যারামিটারগুলির মধ্যে একটির কিছু মান না হয় (বা মানগুলির একটি সীমা) আপনি তৈরি করতে একটি চাপ যোগ করতে পারেন নিশ্চিত যে মানটি এটির প্রত্যাশা আপনিই করেন এবং এটি যদি না হয় তবে সত্যিই কিছু ভুল আছে, এবং তাই অ্যাপটি প্রস্থান করে। ডিবাগিং / ইউনিট পরীক্ষার জন্য জোর দেওয়া খুব কার্যকর হতে পারে এবং আপনি যখন ব্যবহারকারীদের "খারাপ" কাজ থেকে বিরত রাখতে ফ্রেমওয়ার্ক সরবরাহ করেন তখনও।


9
মুক্তির জন্য আপনার NSAssert নেওয়া উচিত। এটি করার জন্য একটি সংকলন-সময় পতাকা রয়েছে।
ব্যারি ওয়ার্ক

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

18
নোট করুন যে এক্সকোড 4 এ রিলিজ কনফিগারেশনে ডিফল্টরূপে সংজ্ঞায়িত NS_BLOCK_ASSERTIONS রয়েছে। আমার ধারণা আপনি যদি পরিবর্তন না করেন যে আপনার প্রকাশিত কোডটিতে এনএসএসার্ট: গুলি থাকবে না।
জনি

16
আমি যদি সঠিকভাবে বুঝতে পারি তবে সেগুলি ছেড়ে দেওয়ার কী দরকার (মুক্তির সংস্করণে)? কেন এনএসএসর্টকে যদি একটি বিবৃতি দিয়ে প্রতিস্থাপন করবেন না, এবং যদি (কোনও ভয়ঙ্কর কিছু ঘটে) তবে ব্যবহারকারীকে অবহিত করুন (বা আপনার নিয়ন্ত্রণে থাকা কিছু করুন), এবং কেবল কি ছাড়ুন / ক্র্যাশ করবেন না এবং কী ঘটেছে তা ভেবে ব্যবহারকারীকে ছেড়ে যান ... বা আমি কিছু অনুপস্থিত করছি?
Gik

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

20

আমি সত্যিই এনএসএসার্টের সাথে কথা বলতে পারি না, তবে আমি ধারণা করি যে এটি সি এর দৃsert়তার সাথে একইভাবে কাজ করে ()।

assert () আপনার কোডে একটি শব্দার্থক চুক্তি প্রয়োগ করতে ব্যবহৃত হয়। যে, আপনি জিজ্ঞাসা অর্থ কি?

ঠিক আছে, আপনি যেমন বলেছেন তার মতো: আপনার যদি এমন কোনও ফাংশন থাকে যা কখনই -1 পাওয়া না যায় তবে আপনার দৃ (়তা () চাপিয়ে দিতে পারে:

অকার্যকর gimme_positive_ints (int i) {
  জোড় (i> 0);
}

এবং এখন আপনি ত্রুটি লগতে (বা এসটিডিআরআর) এর মতো কিছু দেখতে পাবেন:

আমি> 0 যুক্তি ব্যর্থ হয়েছে: ফাইলের উদাহরণ। কোড, লাইন 2

সুতরাং এটি কেবল সম্ভাব্য খারাপ ইনপুটগুলির বিরুদ্ধে সুরক্ষিত রাখে না তবে এটি তাদের দরকারী, মানক উপায়ে লগ করে।

ওহ, এবং কমপক্ষে সি সিলেক্ট করা () একটি ম্যাক্রো ছিল, সুতরাং আপনি আপনার প্রকাশের কোডটিতে একটি দাবী হিসাবে দাবী ()টিকে নতুন করে সংজ্ঞায়িত করতে পারেন। আমি জানি না এটি এনএসএসার্টের ক্ষেত্রে (বা আরও জোর দেওয়া () আরও) থাকলেও those চেকগুলি संकलित করতে এটি বেশ কার্যকর ছিল।


2
হ্যাঁ, এনএসএসর্ট একটি ম্যাক্রোও।
মার্টিন উইকম্যান

18

NSAssertঅ্যাপটি ক্র্যাশ করার চেয়ে আরও বেশি কিছু দেয়। এটি আপনাকে ক্লাস, পদ্ধতি এবং লাইনটি যেখানে দৃser়তার সাথে ঘটেছে তা বলে দেয়। সমস্ত দাবিগুলি সহজেই এনএস_ব্লোক_এএসআরআইটিএস ব্যবহার করে নিষ্ক্রিয় করা যায়। এইভাবে এটি ডিবাগিংয়ের জন্য আরও উপযুক্ত করে তোলে। অন্যদিকে, NSExceptionকেবল একটি নিক্ষেপ করা অ্যাপটিকে ক্র্যাশ করে। এটি ব্যতিক্রমটির অবস্থান সম্পর্কেও জানায় না, এটিকে এত সহজভাবে অক্ষমও করা যায় না। নীচের চিত্রগুলিতে পার্থক্য দেখুন।

অ্যাপ্লিকেশানটি ক্র্যাশ করেছে কারণ এনএসএসার্টের ডকুমেন্টেশনে যেমন দাবি করা হয়েছে একটি ব্যতিক্রমও উত্থাপন করেছে:

যখন আহ্বান করা হয়, তখন একটি দৃ hand় হ্যান্ডলার একটি ত্রুটি বার্তা প্রিন্ট করে যাতে পদ্ধতি এবং শ্রেণীর নাম (বা ফাংশনের নাম) অন্তর্ভুক্ত থাকে। এরপরে এটি একটি এনএসআইটার্নাল ইনকনসিসটেন্সি এক্সসেপশন ব্যতিক্রম উত্থাপন করে।

NSAssert:

একটি দৃser়তা পরে লগ

NSException:

ব্যতিক্রম পরে লগ


একটি NSExceptionআউটপুট এটা মাধ্যমে ফেরৎ কাস্টমাইজ করতে সুযোগের প্রচুর প্রদান করে reasonএবং userInfoপ্যারামিটার। ডিবাগিংয়ে সহায়তার জন্য আপনি ক্লাসের নাম, নির্বাচক, লাইন তথ্য এবং আপনার যে কোনও কিছু যুক্ত করতে আগ্রহী তা যুক্ত করার কোনও কারণ নেই। আইএমএইচও, আপনি NSAssertবিকাশের সময় ডিবাগিংয়ের উদ্দেশ্যে একটি ব্যবহার করেন তবে তাদের শিপিংয়ে অক্ষম করুন; আপনি NSExceptionশিপিং কোডের একটি দৃ as়তা ছেড়ে যেতে চান, আপনি একটি নিক্ষেপ ।
বিপণনকারী

17

সবাই উপরে যা বলেছে তা বাদ দিয়ে NSAssert()(সি এর বিপরীতে assert()) এর ডিফল্ট আচরণ হ'ল একটি ব্যতিক্রম ছোঁড়া, যা আপনি ধরতে এবং পরিচালনা করতে পারবেন। উদাহরণস্বরূপ, এক্সকোড এটি করে।


কীভাবে আমরা ব্যতিক্রমটি ধরে এবং পরিচালনা করতে পারি সে সম্পর্কে আরও কিছু আছে?
Gon

1
কোকো ব্যতিক্রমগুলি "ক্যাচযোগ্য এবং হ্যান্ডেলযোগ্য" ডি ফ্যাক্টো নয়। যদি কল ট্রিের যে কোনও জায়গায় কোনও অ্যাপল ফাংশন দিয়ে নিয়ন্ত্রণ চলে যায় তবে আচরণটি নির্ধারিত। ব্যতিক্রমগুলি পুরোপুরি ত্রুটি প্রতিবেদনের জন্য (ওরফে, সমালোচক ইত্যাদি), জাভা এর মতো সাধারণ ব্যবহারের জন্য নয়।
মাইকেল 17

9

কেবল স্পষ্ট করার জন্য, যেমনটি কেউ উল্লেখ করেছেন তবে পুরোপুরি ব্যাখ্যা করা হয়নি, কেবলমাত্র কাস্টম কোড তৈরি করার পরিবর্তে অ্যাসেসর্ট রাখার এবং ব্যবহারের কারণ (উদাহরণস্বরূপ, ifs করা এবং খারাপ ডেটার জন্য একটি ব্যতিক্রম উত্থাপন) হ'ল উত্পাদনের অ্যাপ্লিকেশনগুলির জন্য অক্ষম করা উচিত।

বিকাশ এবং ডিবাগ করার সময়, ত্রুটিগুলি ধরার জন্য আপনার পক্ষে দৃ enabled় সক্ষম করা হয়েছে। প্রোগ্রামটি থামানো হবে যখন কোনও দৃ an় মান মিথ্যা হিসাবে মূল্যায়ন করা হয়। তবে, উত্পাদনের জন্য সংকলন করার সময়, সংকলক দৃser় কোডটি বাদ দেয় এবং আসলে আপনার প্রোগ্রামটি চালিয়ে যায় FA ততক্ষণে, আশা করছি, আপনি সমস্ত বাগগুলি ঠিক করে দিয়েছেন। উত্পাদনের সময় আপনার প্রোগ্রামটিতে ত্রুটি রয়েছে যদি (যখন দাবিগুলি অক্ষম থাকে এবং প্রোগ্রামটি "দৃ .়ভাবে বাদ দেয়"), আপনার প্রোগ্রামটি সম্ভবত অন্য কোনও সময়ে ক্রাশ হবে।

এনএসএসার্টের সহায়তা থেকে: "প্রিপ্রসেসর ম্যাক্রো এনএস_ব্লক_এএসসিআরটিশন সংজ্ঞায়িত করা হলে দৃ As়তা অক্ষম করা হয়" " সুতরাং, আপনার বিতরণ লক্ষ্যমাত্রে কেবলমাত্র ম্যাক্রো রাখুন [কেবলমাত্র]।


6

NSAssert(এবং এর stdlib সমতুল্য assert) হ'ল উন্নয়নের সময় প্রোগ্রামিং ত্রুটিগুলি সনাক্ত করা। আপনার কাছে কখনও কখনও এমন দাবি করা উচিত নয় যা কোনও উত্পাদন (প্রকাশিত) আবেদনে ব্যর্থ হয়। সুতরাং আপনি দৃ as়ভাবে বলতে পারেন যে আপনি কখনও এমন কোনও পদ্ধতির জন্য নেতিবাচক সংখ্যাটি পাস করবেন না যার জন্য ইতিবাচক যুক্তির প্রয়োজন। পরীক্ষার সময় যদি দৃ ever়তা কখনও ব্যর্থ হয় তবে আপনার একটি বাগ রয়েছে। তবে, পাস করা মানটি যদি ব্যবহারকারী প্রবেশ করিয়ে দেয় তবে আপনাকে উত্পাদনের দৃ as়তার উপর নির্ভর না করে ইনপুটটির যথাযথ বৈধতা অর্জন করতে হবে (অক্ষম করে এমন রিলিজ বিল্ডগুলির জন্য আপনি একটি # নির্দিষ্ট সেট সেট করতে পারেন) NSAssert*


2
+1 কারণ আপনার উত্তরটি আমাকে সবচেয়ে সার্থক করে তোলে! এনএসএসার্ট ব্যবহার করলে তা বোধগম্য হয় না এটি যদি বিকাশের জন্য ব্যবহার হয় তবে প্রকাশের পরে নয়। অনুমোদিত নয় এমন একটি মান প্রবেশকারী একজন ব্যবহারকারীকে ইউআই ত্রুটি অনুসরণ করা উচিত, অ্যাপ্লিকেশন ক্র্যাশ করে না এনএসএসারেট not কুয়াশা মুছে গেছে!
পিনজল

3

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

সংক্ষিপ্ত উত্তর: তারা প্রয়োগ করে যে আপনার কোডটি কেবল উদ্দেশ্য হিসাবে ব্যবহার করা হয়েছে।


3

এটি উল্লেখ করা সার্থক যে রান রান টাইম চেকিং বাদে, চুক্তি অনুসারে প্রোগ্রামিং আপনার কোড ডিজাইন করার সময় ব্যবহৃত একটি গুরুত্বপূর্ণ সুবিধা।

চুক্তি অনুসারে দাবি ও নকশার বিষয়ে আরও তথ্য নীচে পাওয়া যাবে:

দৃser়তা (সফ্টওয়্যার বিকাশ)

চুক্তি দ্বারা ডিজাইন

জোর দিয়ে প্রোগ্রামিং

চুক্তি অনুসারে নকশা করুন, উদাহরণ অনুসারে [পেপারব্যাক]


2

তার প্রশ্নের পুরোপুরি উত্তর দিতে, যে কোনও ধরণের দৃ as়তার মূল বিষয়টি হ'ল ডিবাগিংয়ে সহায়তা করা। তাদের উত্সটিতে ত্রুটিগুলি ধরা আরও মূল্যবান, তারপরে ক্র্যাশ হওয়ার সময় তাদের ডিবাগারে ধরা।

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


-3

NSAssertএটি শর্তের সাথে মিলে গেলে অ্যাপ ক্র্যাশ করুন। শর্তের সাথে মিলে না গেলে পরবর্তী বিবৃতিগুলি কার্যকর করা হবে। নীচের এক্স এর জন্য দেখুন:

আমি কেবল এইটির কাজটি কী তা পরীক্ষা করার জন্য একটি অ্যাপ তৈরি করেছি NSAssert:

    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self testingFunction:2];
}

-(void)testingFunction: (int)anNum{
    // if anNum < 2 -> the app will crash
    // and the NSLog statement will not execute
    // that mean you cannot see the string: "This statement will execute when anNum < 2"
    // into the log console window of Xcode
    NSAssert(anNum >= 2, @"number you enter less than 2");
    // If anNum >= 2 -> the app will not crash and the below 
    // statement will execute
    NSLog(@"This statement will execute when anNum < 2");
}

আমার কোডে অ্যাপটি ক্রাশ হবে না nd এবং পরীক্ষার কেসটি হ'ল:

  • anNum > = 2 -> অ্যাপটি ক্রাশ হবে না এবং আপনি লগ স্ট্রিংটি দেখতে পাবেন: "এই বিবৃতিটি কার্যকর হবে যখন anNum <2" আউটপুট লগ কনসোল উইন্ডোতে into
  • anNum <2 -> অ্যাপ্লিকেশন ক্রাশ হবে এবং আপনি লগের স্ট্রিংটি দেখতে পাবেন না: "এই বিবৃতিটি কার্যকর হবে যখন anNum <2"

1
আপনি এটি অন্য রাস্তা পেয়েছেন। "এনএসএসর্ট শর্তের সাথে মেলে এটি অ্যাপ ক্র্যাশ করে তোলে the শর্তের সাথে মিলে না গেলে পরবর্তী বিবৃতি কার্যকর হবে"। NSAssert অ্যাপ্লিকেশনটিকে শর্তের সাথে মেলে না, যদি এটি শর্তের সাথে মেলে না match
জো ট্যাম

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