2017-12-27 186 views
1

即時工作的任務,我現在必須實施嘗試&捕捉方法也趕上我的程序中的數字以外的輸入。我理解我學習過程中的過程和解釋,並在嘗試時做了一些小例子。但是當我想把這個工作貫徹到我的任務中時,我陷入了困境。有人可以在莊園裏向我解釋,不要破壞任何東西,只是試圖幫助我一路?試着抓住C#我該怎麼做?

這裏是我的代碼:

using System; 

namespace BastunKP 
{ 
    class Program 
    { 
     public static double FahrToCels(double fahr) 
     { 
      return (fahr - 32) * 5/9; 
     } 

     public static void Main(string[] args) 
     { 
      Console.WriteLine("Skriv in Fahrenheit: "); 
      double fahr = Convert.ToDouble(Console.ReadLine()); 
      double tempCels = FahrToCels(fahr); 

      do    
      {  
      try    
      { 
       //Dont know what to write here. 
      } 
      catch 
      { 
       Console.WriteLine("Du kan bara skriva in siffor, testa igen."); 
      } 

      if (tempCels < 73) 
      { 
       Console.WriteLine("Temperaturen är för kallt, skruva upp lite!"); 
      } 
      else if (tempCels > 77) 
      { 
       Console.WriteLine("Temperaturen är för varmt, skruva ner lite!"); 
      } 
      else 
      { 
       Console.WriteLine("Temperaturen är nu bra, hoppa in!"); 
       Console.ReadKey(); 
      } 

      fahr = Convert.ToDouble(Console.ReadLine()); 
      tempCels = FahrToCels(fahr);    
      }   
      while (tempCels < 73 || tempCels > 77); 
      return; 
     } 
    } 
} 
+1

'//不知道該怎麼寫here.'無論代碼是_might_拋出異常。 _在你添加'try..catch'之前,想想你打算編寫的代碼。這是你應該把裏面的'try' block._ – mjwills

+0

首先,我認爲我必須有代碼的代碼「雙法爾= Convert.ToDouble(到Console.ReadLine());」在那裏,但那是行不通的。 – Kian

+0

在try之外聲明你的變量。在裏面,只需分配值。 – Magnetron

回答

1

首先,讓我們編寫沒有任何異常處理的代碼。首先獲得基本知識。我們需要一種方法:

  1. 詢問用戶的華氏溫度。
  2. 如果輸入不是有效的double,請轉至1.
  3. 將該值轉換爲攝氏度。
  4. 如果沒有,去1
  5. 如果攝氏溫度不屬於(73, 77)去1

    public static double GetTemperatureFromUser() 
    { 
        while (true) 
        { 
          Console.Write("Enter temperature in Fahrenheit: "); 
          var t = FahrToCels(Convert.ToDouble(Console.ReadLine())); 
    
          if (t < 73) 
          { 
           Console.Write("Temperature is too low. Try again."); 
          } 
          else if (t > 77) 
          { 
           Console.Write("Temperature is too high. Try again."); 
          } 
          else 
          { 
           return t; 
          } 
        } 
    } 
    

好吧,這看起來不錯。現在我們來添加一些異常處理。第一個問題:這裏會出現什麼問題並拋出異常?

var t = FahrToCels(Convert.ToDouble(Console.ReadLine())); 

似乎是一個可能的嫌疑犯。還有什麼可以拋出?嗯,不。

好的,第二個問題:如果ToDouble()拋出什麼代碼不應該執行?那麼,顯然這取決於ToDouble()的結果。所以所有的代碼也在try塊中。

好的,第三個問題:如果ToDouble()拋出什麼代碼應該運行?在我們的情況下,我們應該通知用戶輸入不是有效的double。好的,該代碼需要在catch區塊中進行。

try-catch覺得作爲一個奇特的if控制代碼的執行路徑:如果代碼拋出,去catch如果沒有,保持try塊內正常執行。

第四個問題:無論發生什麼情況,trycatch塊內的其他所有內容都應該運行什麼代碼?在你的情況下,什麼都沒有,但如果有的話,它會在finally區塊中出現。

注意catchfinally塊是不是強制性的。唯一的規則是它們中的至少一個必須緊跟在try塊之後; try-catch,try-finallytry-catch-finally都是有效的。

第五和最後一個:你要處理哪種異常?您應該始終處理只有您知道如何處理的例外情況,並忽略所有其他情況。 ToDouble會拋出什麼異常?如果您閱讀文檔,您會發現它可能會丟失FormatExceptionOverflowException。您可以處理兩者,因爲它們構成了相同的事情:無效的用戶輸入。

好吧,讓我們重寫方法:

是否while循環依賴於ToDouble無論發生什麼事情?不,不管內部發生什麼,該方法都應該循環運行;退出循環的唯一方法是當用戶輸入一個有效的數字並且方法返回時。好吧,那將while塊去外面任何異常處理等不提示用戶:

public static double GetTemperatureFromUser() 
{ 
    while (true) 
    { 
     Console.Write("Enter temperature in Fahrenheit: "); 
     //... 
    } 
} 

而現在的下一條指令是我們的首要犯罪嫌疑人,因此很明顯必須去try塊內。一切我們已經寫在我們的方法取決於t的價值,所以我們把所有的也try塊內:

public static double GetTemperatureFromUser() 
{ 
    while (true) 
    { 
      Console.Write("Enter temperature in Fahrenheit: "); 

      try 
      { 
       var t = FahrToCels(Convert.ToDouble(Console.ReadLine())); 

       if (t < 73) 
       { 
        Console.Write("Temperature is too low. Try again."); 
       } 
       else if (t > 77) 
       { 
        Console.Write("Temperature is too high. Try again."); 
       } 
       else 
       { 
        return t; 
       } 
     } 
    } 
} 

好了,現在我們只缺少catch塊。我們將爲每個我們知道如何處理的異常添加一個:

public static double GetTemperatureFromUser() 
{ 
    while (true) 
    { 
      Console.Write("Enter temperature in Fahrenheit: "); 

      try 
      { 
       var t = FahrToCels(Convert.ToDouble(Console.ReadLine())); 

       if (t < 73) 
       { 
        Console.Write("Temperature is too low. Try again."); 
       } 
       else if (t > 77) 
       { 
        Console.Write("Temperature is too high. Try again."); 
       } 
       else 
       { 
        return t; 
       } 
     } 
     catch (FormatException) 
     { 
       Console.Write("Invalid number format. Try again."); 
     } 
     catch (OverflowException) 
     { 
       Console.Write("Number is too large or too small. Try again."); 
     } 
    } 
} 

然後你走了,我們完成了。

+0

謝謝!這使代碼工作!有一個問題,你在哪裏獲得catch參數中的「FormatException」和「OverflowException」的名字?所有的 – Kian

+0

@Kian首先,這個答案並不意味着「使代碼工作」,其意思是讓你開始瞭解異常處理在C#中是如何工作的。簡單地使你的代碼工作將需要更短的答案。其次,'System.FormatException'和'System.OverflowException'是在擴展'System.Exception'的框架中實現的類。 – InBetween

0

沒有要求try/catch檢查有效的輸入。你可以使用double.TryParse;

Console.WriteLine("Skriv in Fahrenheit: "); 
double fahr; 
double tempCels; 
bool isInputCorrect = false; 
while (!isInputCorrect) 
{ 
    var input = Console.ReadLine(); 
    if (!double.TryParse(input, out fahr)) 
    { 
     Console.WriteLine("Du kan bara skriva in siffor, testa igen."); 
     continue; 
    } 
    tempCels = FahrToCels(fahr); 
    if (tempCels < 73) 
    { 
     Console.WriteLine("Temperaturen är för kallt, skruva upp lite!"); 
     continue; 
    } 
    else if (tempCels > 77) 
    { 
     Console.WriteLine("Temperaturen är för varmt, skruva ner lite!"); 
     continue; 
    } 
    isInputCorrect = true; 
} 
Console.WriteLine("Temperaturen är nu bra, hoppa in! tempCels : " + tempCels); 
Console.ReadKey(); 

如果你堅持使用try/catch,你可以嘗試這樣的;

只需更換double.TryParse部分。

var input = Console.ReadLine(); 
try 
{ 
    fahr = Convert.ToDouble(input); 
} 
catch (Exception e) 
{ 
    Console.WriteLine("Du kan bara skriva in siffor, testa igen."); 
    continue; 
} 
+0

謝謝你的評論,但由於我的任務需要我使用try/catch-method,所以我必須讓它工作。 – Kian

+0

你是否甚至懶得讀這個問題?他*應該*使用'try-catch'。 – InBetween

+0

@InBetween,「我現在要實現的嘗試和捉住方法太趕比我的節目數量等投入」你是怎麼從這個句子理解? – lucky