সি # তে জাভা-স্টাইলের থ্রো কীওয়ার্ডটি কীভাবে ব্যবহার করবেন?


91

জাভাতে, throwsকীওয়ার্ডটি কোনও পদ্ধতির জন্য এটি ঘোষণা করতে দেয় যে এটি নিজের থেকে কোনও ব্যতিক্রম পরিচালনা করবে না, বরং কলিং পদ্ধতিতে ফেলে দেবে।

সি # তে কি কোনও অনুরূপ কীওয়ার্ড / বৈশিষ্ট্য রয়েছে?

যদি কোনও সমতুল্য না থাকে তবে আপনি কীভাবে একই (বা অনুরূপ) প্রভাব অর্জন করতে পারেন?

উত্তর:


78

জাভাতে, আপনাকে অবশ্যই একটি ব্যতিক্রম হ্যান্ডেল করতে হবে বা পদ্ধতিটিকে throwsকীওয়ার্ড ব্যবহার করে নিক্ষেপ করতে হবে হিসাবে চিহ্নিত করতে হবে ।

সি # এর এই কীওয়ার্ড বা সমতুল্য নেই, সি # এর মতো, আপনি যদি কোনও ব্যতিক্রম না পরিচালনা করেন তবে এটি বুদবুদ হয়ে যাবে, ধরা না পড়লে বা ধরা না পড়লে এটি প্রোগ্রামটি শেষ করে দেবে।

আপনি যদি এটি পরিচালনা করতে চান তবে নীচে করতে পারেন:

try
{
  // code that throws an exception
}
catch(ArgumentNullException ex)
{
  // code that handles the exception
  throw;
}

4
"এটি বুদবুদ হবে", এর অর্থ কি এটি জাভাতে একটি থ্রো ক্লজ থাকার সমস্ত পদ্ধতির সমান?
লুই রাইস

4
@ লুইস আরএইচ - এক ধরণের। এর অর্থ একটি ব্যতিক্রম, যদি পরিচালনা না করা হয়, পরিচালনা না করা পর্যন্ত প্রতিটি কলিং ফাংশন মাধ্যমে কল চেইন উপরে যাবে।
ওডে

4
@ লুইস এইচ সম্পূর্ণরূপে নয়, এর অর্থ কোডটি সংকলন করতে আপনাকে কমপক্ষে আপনার মেইন থেকে ব্যতিক্রমটি ধরতে হবে। যেহেতু সি # চেক হওয়া ব্যতিক্রমগুলি জানেন না তাদের ধরার বিষয়টি আপনার হাতে রয়েছে অন্যথায় তারা কেবল রানটাইমের সময় নেমে আপনার কোডটি বাধাগ্রস্থ করবে।
জোহানেস ওয়াচটার

4
@ জাওয়াতচার: একটি প্রধান পদ্ধতিতে একটি থ্রো ক্লজও থাকতে পারে।
লুই রাইস

4
@ আশিষকাম্বেলে - এএইচ। মতামত ব্যাপার. নেট থেকে ব্যতিক্রম হ্যান্ডলিং আলাদা । "আরও ভাল" কি তা আপনি জানেন না।
ওডে

109

অপ সম্পর্কে জিজ্ঞাসা করা হয় জাভা এর সি # সমতুল্য throwsদফা না - throwশব্দ। এটি জাভাতে পদ্ধতি স্বাক্ষরগুলিতে ব্যবহৃত হয় এটি চিহ্নিত করতে একটি পরীক্ষিত ব্যতিক্রম নিক্ষেপ করা যেতে পারে।

সি # তে, জাভা চেক করা ব্যতিক্রমের সরাসরি সমতুল্য নেই। সি # এর কোনও সমতুল্য পদ্ধতি স্বাক্ষর শর্ত নেই

// Java - need to have throws clause if IOException not handled
public void readFile() throws java.io.IOException {
  ...not explicitly handling java.io.IOException...
}

অনুবাদ

// C# - no equivalent of throws clause exceptions are unchecked
public void ReadFile() 
{
  ...not explicitly handling System.IO.IOException...
}

30

হ্যাঁ এটি একটি পুরানো থ্রেড, তবে উত্তরগুলি গুগল করার সময় আমি প্রায়শই পুরানো থ্রেডগুলি খুঁজে পাই তাই আমি অনুভব করেছি যে আমি খুঁজে পেয়েছি এমন দরকারী কিছু যুক্ত করব।

আপনি যদি ভিজ্যুয়াল স্টুডিও 2012 ব্যবহার করছেন তবে একটি বিল্ট ইন সরঞ্জাম রয়েছে যা আইডিই স্তর "থ্রো" সমতুল্যকে মঞ্জুরি দেওয়ার জন্য ব্যবহার করা যেতে পারে।

যদি আপনি উপরে বর্ণিত হিসাবে এক্সএমএল ডকুমেন্টেশন মন্তব্য ব্যবহার করেন তবে আপনি পদ্ধতি বা শ্রেণীর দ্বারা ছুঁড়ে দেওয়া ব্যতিক্রমের ধরণের পাশাপাশি কখন বা কেন নিক্ষেপ করা হয়েছে সে সম্পর্কিত তথ্য নির্দিষ্ট করতে আপনি <এক্সসেপশন> ট্যাগ ব্যবহার করতে পারেন ।

উদাহরণ:

    /// <summary>This method throws an exception.</summary>
    /// <param name="myPath">A path to a directory that will be zipped.</param>
    /// <exception cref="IOException">This exception is thrown if the archive already exists</exception>
    public void FooThrowsAnException (string myPath)
    {
        // This will throw an IO exception
        ZipFile.CreateFromDirectory(myPath);
    }

4
ওপি, এটি আপনার উত্তর। আমি অনুমান করছি, তবে জাভা এর throwsসম্ভবত বিকাশকারীদের কাছে তথ্যবহুল হওয়া বাদ দিয়ে রানটাইমের কিছুই নয়। তেমনি, @ এমওয়ানেলা এখানে যা দেখিয়েছে তা হ'ল সি'র উপায় ঠিক একই। আমি ধরে নিচ্ছি যে আপনি ইতিমধ্যে জানেন যে এই "এক্সএমএল ডকুমেন্টেশন" এর আরও উল্লেখযোগ্য উদ্দেশ্য রয়েছে। আমি জানি এই সুতোটি পুরানো।
হরি লুবোভাচ

প্রকৃতপক্ষে, জাভা ব্যতিক্রমগুলি বুবলি করবে না যতক্ষণ না এটি স্পষ্টভাবে কোনও throwsধারাতে নির্দিষ্ট করা হয় বা throwকমান্ড দ্বারা নিক্ষেপ করা হয় । এর অর্থ যদি একটি রানটাইম এক্সসেপশন ঘটে এবং একই পদ্ধতিতে যেখানে এটি ঘটে পরিচালনা না করা হয়, সেখানে মৃত্যুদন্ড কার্যকর হবে।
পেড্রো লিমা

18

আমি সবেমাত্র বাইটস.কম-এ পেয়েছি এমন একটি প্রশ্নের উত্তর এখানে দেওয়া হয়েছে :

সংক্ষিপ্ত উত্তর হলো 'না'। সি # তে কোনও চেক করা ব্যতিক্রম নেই। ভাষার ডিজাইনার এই সাক্ষাত্কারে এই সিদ্ধান্তটি নিয়ে আলোচনা করেছেন:

http://www.artima.com/intv/handcuffs.html

আপনি পেতে পারেন নিকটতমটি হ'ল আপনার এক্সএমএল ডকুমেন্টেশনে ট্যাগগুলি ব্যবহার করা এবং আপনার কোড / অ্যাসেমব্লিসহ এনডিওকে উত্পন্ন ডকগুলি বিতরণ করা যাতে অন্যান্য লোকেরা দেখতে পারে যে আপনি কোন ব্যতিক্রম নিক্ষেপ করছেন (এমএসডিএন ডকুমেন্টেশনে এমএস ঠিক এটি করেন)। অপরিবর্তিত ব্যতিক্রমগুলি সম্পর্কে আপনাকে জানাতে আপনি সংকলকটির উপর নির্ভর করতে পারবেন না, তবে জাভাতে আপনাকে অভ্যস্ত হতে পারে।


7

এখানে বেশিরভাগ উত্তর দিয়ে যাওয়ার পরে, আমি কয়েকটা চিন্তা যোগ করতে চাই।

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

  2. সি # ডিজাইন দল চেক করা ব্যতিক্রমগুলির বিরুদ্ধে কেন সিদ্ধান্ত নিয়েছিল সে সম্পর্কে এখানে উত্তরগুলিতে অ্যান্ড্রেস এন্টারস হিজলসবার্গের সাথে একটি সাক্ষাত্কার যুক্ত করেছিলেন। মূল প্রশ্নের চূড়ান্ত প্রতিক্রিয়াটি সেই সাক্ষাত্কারে লুকিয়ে রয়েছে:

প্রোগ্রামাররা তাদের কোডটি সুরক্ষিতভাবে শেষ পর্যন্ত সর্বত্রের চেষ্টা করে সুরক্ষিত করে, তাই যদি কোনও ব্যতিক্রম ঘটে তবে তারা সঠিকভাবে ফিরে আসবে, তবে তারা ব্যতিক্রমগুলি পরিচালনা করতে আসলে আগ্রহী নয়।

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

-

ব্যক্তিগতভাবে, আমি এখানে ছেঁড়া আমি অ্যান্ডার্সের সাথে একমত হয়েছি যে ব্যতিক্রমগুলি পরীক্ষা করে নেওয়া নতুন, বিভিন্ন সমস্যা যুক্ত না করে সমস্যার সমাধান করে না। এক্সএমএল ডকুমেন্টেশন মন্তব্যের মত, আমি খুব কমই চেষ্টা করি যা শেষ পর্যন্ত ব্লক করে রাখা সমস্ত কিছু দিয়ে সি # কোড দেখায়। এটি আমার কাছে বোধ হয় যদিও এটি সত্যই আপনার একমাত্র বিকল্প এবং এমন কিছু যা ভাল অনুশীলনের মতো বলে মনে হচ্ছে।


3

আসলে সি # তে ব্যতিক্রমগুলি পরীক্ষা না করা ভাল বা খারাপ জিনিস হিসাবে বিবেচনা করা যেতে পারে।

আমি নিজে এটিকে একটি ভাল সমাধান হিসাবে বিবেচনা করি কারণ চেক করা ব্যতিক্রমগুলি আপনাকে নিম্নলিখিত সমস্যাগুলি সরবরাহ করে:

  1. ব্যবসায়িক / ডোমেন স্তরটিতে প্রযুক্তিগত ব্যতিক্রম ফাঁস হওয়ায় আপনি সেগুলি নিম্ন স্তরে সঠিকভাবে পরিচালনা করতে পারবেন না।
  2. এগুলি পদ্ধতির স্বাক্ষরের অন্তর্ভুক্ত যা এপিআই ডিজাইনের সাথে সর্বদা সুন্দর হয় না।

বেশিরভাগ বড় অ্যাপ্লিকেশনগুলিতে এর ফলে আপনি যখন পরীক্ষা করা ব্যতিক্রম ঘটে তখন প্রায়শই নিম্নলিখিত প্যাটার্নটি দেখতে পাবেন:

try {
    // Some Code
} catch(SomeException ex){
    throw new RuntimeException(ex);
}

যার মূলত সি # /। নেট সমস্ত ব্যতিক্রম পরিচালনা করে way


লাম্বডাসের সাথে কীভাবে পরীক্ষিত ব্যতিক্রমগুলি মিশে যায় তা আমি ভাবতে পারি না!
গাবে

@ গ্যাবে: আমি নিশ্চিত যে আপনি এমন কিছু ধারণা নিয়ে আসতে পারেন যা আপনাকে সেগুলি মিশ্রিত করতে পারে, তবে আমি যেমন বলেছিলাম, চেক করা ব্যতিক্রমগুলি বেশিরভাগই জাভাতে রয়েছে বিশেষত আরও জটিল অ্যাপ্লিকেশনগুলিতে ভাল অভ্যাস নয়। সুতরাং এটি ভাল যে তারা সি # তে নেই।
জোহানেস ওয়াচটার

3

আপনি এই সম্পর্কে জিজ্ঞাসা করছেন:

একটি ব্যতিক্রম পুনরায় নিক্ষেপ

public void Method()
{
  try
  {
      int x = 0;
      int sum = 100/x;
  }
  catch(DivideByZeroException e)
  {
      throw;
  }
}

বা

static void Main() 
    {
        string s = null;

        if (s == null) 
        {
            throw new ArgumentNullException();
        }

        Console.Write("The string s is null"); // not executed
    }

4
ব্যবহারের জন্য +1 throw। এটি ব্যবহার করে, স্ট্যাকের ট্রেসটি নষ্ট হবে না।
জিউসেপ আকাপুটো

2

নেট কোডকন্ট্র্যাক্ট EnsuresOnThrow<>এবং জাভা throwsবর্ণনাকারীর মধ্যে কিছু ক্ষণস্থায়ী সামঞ্জস্য রয়েছে, এতে উভয়ই কলকারীকে কোনও ফাংশন বা পদ্ধতি থেকে উত্থাপিত হতে পারে এমন ব্যতিক্রম হিসাবে সংকেত দিতে পারে, যদিও এর মধ্যে 2 এর মধ্যেও প্রধান পার্থক্য রয়েছে:

  • EnsuresOnThrow<>কোন ব্যতিক্রমগুলি নিক্ষেপ করা যেতে পারে তা কেবল উল্লেখ করার বাইরে চলে যায়, তবে তাদের যে শর্তের অধীনে নিক্ষেপ করার গ্যারান্টিযুক্ত তাও নির্ধারণ করে - যদি ব্যতিক্রম শর্তটি চিহ্নিত করার জন্য তুচ্ছ না হয় তবে এটি তথাকথিত পদ্ধতিতে বেশ জোরালো কোড হতে পারে। জাভা throwsএকটি ইঙ্গিত দেয় যে ব্যতিক্রমগুলি নিক্ষেপ করা যেতে পারে (অর্থাত্ আইএমও ফোকাস।। নেট পদ্ধতিটির মধ্যে রয়েছে যা প্রমাণ করার জন্য চুক্তি করে throw, অন্যদিকে জাভাতে ব্যতিক্রমের সম্ভাবনা স্বীকার করার জন্য কলারের দিকে মনোনিবেশ করা হয়)।
  • । নেট সিসি জাভা আছে যাচাই করা বনাম চেক করা ব্যতিক্রমগুলির মধ্যে পার্থক্য তৈরি করে না , যদিও সিসি ম্যানুয়াল বিভাগে ২.২.২ উল্লেখ করেছে

"কেবলমাত্র সেই ব্যতিক্রমগুলির জন্য ব্যতিক্রমী পোস্টকন্ডিশনগুলি ব্যবহার করুন যা একজন কলকারী এপিআইয়ের অংশ হিসাবে আশা করে"

  • ইন। নেট কলার ব্যতিক্রম (যেমন চুক্তি অক্ষম করে) দিয়ে কিছু করতে হবে কি না তা নির্ধারণ করতে পারে। জাভাতে, কলকারীকে অবশ্যই কিছু করতে হবে , এমনকি যদি এটি throwsতার ইন্টারফেসে একই ব্যাতিক্রমের জন্য যোগ করে।

কোড চুক্তি ম্যানুয়াল এখানে


0

যদি সি # পদ্ধতির উদ্দেশ্যটি কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলা হয় (যেমন জেএস রিটার্ন টাইপ বলে) আমি কেবলমাত্র সেই ব্যতিক্রমটি ফিরিয়ে দেওয়ার পরামর্শ দিই। উদাহরণটি নমুনা দেখুন:

    public EntityNotFoundException GetEntityNotFoundException(Type entityType, object id)
    {
        return new EntityNotFoundException($"The object '{entityType.Name}' with given id '{id}' not found.");
    }

    public TEntity GetEntity<TEntity>(string id)
    {
        var entity = session.Get<TEntity>(id);
        if (entity == null)
            throw GetEntityNotFoundException(typeof(TEntity), id);
        return entity;
    }


-1

যারা ভাবছেন তাদের জন্য, আপনি এটি পরবর্তী পদ্ধতিতে পাস করার জন্য কী ধরেন তা নির্ধারণ করার প্রয়োজনও নেই। যদি আপনি আপনার সমস্ত ত্রুটিটি একটি মূল থ্রেডে পরিচালনা করতে চান তবে আপনি কেবল সমস্ত কিছু ধরে রাখতে এবং এটিকে পাস করে দিতে পারেন:

try {
    //your code here
}
catch {
    //this will throw any exceptions caught by this try/catch
    throw;
}

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