when هي الكلمة المفتاحية في تصفية الاستثناءات. توضع بعد عبارة catch ويمكن أن تأخذ تعبيرًا منطقيًا يحتوي على أي قيم في النطاق في تلك اللحظة. إذا كان ناتج التعبير صحيحًا فستُنفَّذ الكتلة المرتبطة بعبارة catch تلك، وإلا فتُفحَص عبارة catch التالية، إن وُجدت.
try
{
// do stuff
}
catch (Exception ex) when (ex.Message != "")
{
// output the message when it is not empty
}
catch (Exception ex)
{
// show stack trace or something.
}
الاستثناء المعرَّف من المستخدم هو أي صنف معرَّف في الكود لديك ومشتق من System.Exception. يخضع لكل قواعد وراثة الأصناف، لكن إضافةً إلى ذلك يعامل المُصرِّف وبيئة تشغيل اللغة هذه الأصناف معاملة خاصة تسمح بإطلاق نُسخها والتقاطها خارج مسار التحكم المعتاد، كما نوقش في تمرين exceptions.
غالبًا ما تُستخدم الاستثناءات المعرَّفة من المستخدم لحمل معلومات إضافية، مثل رسالة وبيانات أخرى ذات صلة، لتكون متاحة لإجراءات الالتقاط.
أثناء عملك في Instruments of Texas، تُوكل إليك مهمة العمل على آلة حاسبة تجريبية مكتوبة بلغة C#. أنت تبني منصة اختبار للتحقق من عدد من دوال الآلة الحاسبة، بدءًا من الضرب. وستلاحظ أن هناك اهتمامًا خاصًّا عندما يكون طرفا عملية الضرب سالبين.
لقد زُوِّدت بالصنف Calculator، ولا ينبغي تعديله.
CalculationException المعرَّف من المستخدمأكمل تعريف مُنشئ CalculationException، والذي سيحتاج إلى تخزين (تغليف) أي استثناء تُطلقه الآلة الحاسبة، إضافة إلى طرفَي العملية الجاري معالجتهما لحظة إطلاق الاستثناء.
نفِّذ طريقة CalculatorTestHarness.Multiply()، التي ينبغي أن تستدعي طريقة Calculator.Multiply() في نسخة Calculator الممرَّرة إلى المُنشئ، مع تمرير القيمتين الصحيحتين x و y. إذا حدث تجاوز سعة في طريقة Calculator.Multiply()، فستُطلق استثناءً من نوع OverflowException. ينبغي التقاط هذا الاستثناء في طريقة CalculatorTestHarness.Multiply() ولفّه داخل CalculationException، وينبغي تخزين طرفَي العملية، وهما القيمتان x و y الممرَّرتان. كما ينبغي إطلاق كائن CalculationException المُنشأ حديثًا. ويمكنك تجاهل القيمة التي تُرجعها طريقة Calculator.Multiply() إذا نجحت.
var cth = new CalculatorTestHarness(new Calculator());
cth.Multiply(Int32.MaxValue, Int32.MaxValue);
// => throws an instance of CalculationException
var cth2 = new CalculatorTestHarness(new Calculator());
cth2.Multiply(3, 2);
// => silently exits
نفِّذ طريقة CalculatorTestHarness.TestMultiplication() التي تأخذ عددين صحيحين وتستدعي طريقة CalculatorTestHarness.Multiply(). فتُرجع "Multiply succeeded".
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(6, 7);
// => "Multiply succeeded"
عدِّل طريقة CalculatorTestHarness.TestMultiplication() بحيث تُرجع "Multiply failed for negative operands. <INNER_EXCEPTION_MESSAGE>" إذا كان الوسيطان الصحيحان سالبين (أقل من صفر).
ينبغي استبدال العنصر النائب <INNER_EXCEPTION_MESSAGE> برسالة الاستثناء الداخلي في CalculationException.
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(-2, -Int32.MaxValue);
// => "Multiply failed for negative operands. " + innerException.Message
عدِّل طريقة CalculatorTestHarness.TestMultiplication() بحيث تُرجع "Multiply failed for mixed or positive operands. <INNER_EXCEPTION_MESSAGE>" إذا كان أحد الوسيطين الصحيحين على الأقل غير سالب.
ينبغي استبدال العنصر النائب <INNER_EXCEPTION_MESSAGE> برسالة الاستثناء الداخلي في CalculationException.
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(Int32.MaxValue, Int32.MaxValue);
// => "Multiply failed for mixed or positive operands. " + innerException.Message
سجّل في Exercism لتتعلّم وتتقن C# عبر 62 مفهومًا178 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.