2017-10-05 2 views
-3

Ich versuche, eine voll funktionsfähige Rechner-Anwendung für eine Schule Aufgabe zu machen. Um das zu tun, obwohl ich brauche try-catch verwenden, um den DivideByZero Fehler zu behandeln dies mein Code ist jetzt:Try-Catch-Formatierung C#

try 
{ 
    Console.WriteLine("Type 1st number: "); 
    num1 = Convert.ToInt32(Console.ReadLine()); 

    Console.Write("type 2nd number: "); 
    num2 = Convert.ToInt32(Console.ReadLine()); 

    Console.Write("type operation(x ,/, +, -, Fs) "); 
    operation = Console.ReadLine(); 
} 

catch(DivideByZeroException) 
{ 
    Console.WriteLine("Sorry moron you can't divide by zero"); 
} 

aber es funktioniert nicht. Es scheint meinen Code an der Spitze ungültig zu machen. Weiß jemand, wie man es richtig formatiert?

P.S. Vollständige Code hier:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Calculator_MK._2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Calculator(); 

     } 

     private static void Calculator() 
     { 
      decimal num1; 
      decimal num2; 
      string operation; 
      decimal result; 
      decimal num3; 
      decimal num4; 

      Console.WriteLine("This is IK's Calculator program that should work if you do everything I say"); 
      Console.ReadLine(); 
      try 
      { 
       Console.WriteLine("Type 1st number: "); 
       num1 = Convert.ToInt32(Console.ReadLine()); 


       Console.Write("type 2nd number: "); 
       num2 = Convert.ToInt32(Console.ReadLine()); 

       Console.Write("type operation(x ,/, +, -, Fs) "); 
       operation = Console.ReadLine(); 
      } 

      catch(DivideByZeroException) 
      { 

       Console.WriteLine("Sorry moron you can't divide by zero"); 

      } 

      if (operation == "x") 
      { 
       result = num1 * num2; 
       Console.WriteLine("{0} * {1} = {2}", num1, num2, result); 
       Console.ReadLine(); 
      } 

      else if (operation == "/") 
      { 
       result = num1/num2; 
       Console.WriteLine("{0}/{1} = {2}", num1, num2, result); 
       Console.ReadLine(); 
      } 


      else if (operation == "+") 
      { 
       result = num1 + num2; 
       Console.WriteLine("{0} + {1} = {2}", num1, num2, result); 
       Console.ReadLine(); 
      } 
      else if (operation == "-") 
      { 
       result = num1 - num2; 
       Console.WriteLine("{0} - {1} = {2}", num1, num2, result); 
       Console.ReadLine(); 
      } 
      else if (operation == "Fs") 
      { 

       int a = 0; 
       int b = 1; 
       int c = 1; 

       Console.WriteLine(a); 
       Console.WriteLine(b); 

       for (; c <= 34; c = a + b) 
       { 
        Console.WriteLine(c); 
        a = b; 
        b = c; 
        Console.WriteLine(); 
       } 

      } 
      if (num2 == 0) 
      { 

       Console.WriteLine("Can't divide by zero fool"); 



      } 

     } 

    } 
} 
+0

'catch (DivideByZeroException Ex)' – Gusman

+1

Sie müssen Betriebslogik innerhalb 'try' Block setzen. – apocalypse

+1

Was bedeutet "nicht funktioniert"? Irgendein Fehler? – HimBromBeere

Antwort

5

Der try Block um den Code zu sein hat, der die Ausnahme verursacht, in Ihrem Fall ist dies

result = num1/num2; 

Aber es wäre besser, es zu prüfen, für 0, bevor Sie anrufen Diese Zeile und damit die Ausnahme vermeiden.

2

Sie müssen try den Betrieb selbst und nicht die Auswahl der Operation:

else if (operation == "/") 
{ 
    try 
    { 
       result = num1/num2; 
       Console.WriteLine("{0}/{1} = {2}", num1, num2, result); 
       Console.ReadLine(); 
    } 
    catch(DivideByZeroException ex) 
    { 
    Console.WriteLine("Sorry moron you can't divide by zero"); 

    } 

} 

Gerade jetzt versuchen Sie Eingaben vom Benutzer zu lesen. Wenn der Benutzer Eingaben etwas falsch whichc eine Ausnahme auslösen würde, Ihre try Block auslösen würde, aber die catch gewohnt, weil sie eine DivideByZeroException suchen, die gewohnt durch Eingabe auftreten

3

Das Problem, das Sie haben, ist, dass Sie den Versuch erklärt haben,/catch an der falschen Stelle in der Anwendung:

 try 
     { 
      Console.WriteLine("Type 1st number: "); 
      num1 = Convert.ToInt32(Console.ReadLine()); 


      Console.Write("type 2nd number: "); 
      num2 = Convert.ToInt32(Console.ReadLine()); 

      Console.Write("type operation(x ,/, +, -, Fs) "); 
      operation = Console.ReadLine(); 
     } 

     catch(DivideByZeroException) 
     { 

      Console.WriteLine("Sorry moron you can't divide by zero"); 

     } 

Alles, was hier vor sich geht, sind String-zu-Zahlen-Konvertierungen. Es gibt keine mathematischen Operationen, die zu DivideByZeroException Ausnahmen führen könnten.

Stattdessen könnten Sie die Teilungsoperation und alles, nachdem sie wickeln Sie wollen nicht laufen, wenn es eine Ausnahme ist:

 else if (operation == "/") 
     { 
      try 
      { 
       result = num1/num2; 
       Console.WriteLine("{0}/{1} = {2}", num1, num2, result); 
       Console.ReadLine(); 
      } 
      catch (DivideByZeroException) 
      { 
       Console.WriteLine("Sorry moron you can't divide by zero"); 
      } 
     } 

Das heißt, es ist keine gute Praxis Ausnahmen geschehen zu lassen in C#, wenn sie vermieden werden können. In diesem Fall müssen Sie nur den Divisor überprüfen, um sicherzustellen, dass es nicht Null ist, um zu verhindern, dass eine Ausnahme auftritt.

 else if (operation == "/") 
     { 
      if (num2 != 0) 
      { 
       result = num1/num2; 
       Console.WriteLine("{0}/{1} = {2}", num1, num2, result); 
       Console.ReadLine(); 
      } 
      else 
      { 
       Console.WriteLine("Sorry moron you can't divide by zero"); 
      } 
     }