[問題] 防呆寫法

作者: abc95007 (別理我)   2018-10-04 15:10:07
請問關於 C# 防呆 寫法要怎樣比較妥當?
下面四種方法
Funciton 回傳 bool , 最外層再來寫錯誤訊息
或是 string 或 enum 或是自己些個 關於 Error class 代進去
或是 try catch (應該比較不推薦)
寫法讓我困擾滿久的
感謝~
public enum Error
{
Pass, CantOpenFile,
}
class Program
{
static void Main(string[] args)
{
string filePath = @"C:\123.txt";
//case1
//用 if + bool 來判斷是否成功 ,
if (File.checkFile(filePath))
{
Console.WriteLine("檔案存在");
}
else
{
Console.WriteLine("檔案不存在");
}
//case2
// 用 message 丟進去, 再判斷是否成功 , 無回傳 bool
string message = "";
File.checkFile(filePath, ref message);
Console.WriteLine(message);
//case3
Error error = Error.Pass;
File.checkFile(filePath, ref error);
Console.WriteLine(error.ToString());
//case4
try
{
//........
}
catch (Exception)
{
throw;
}
}
}
class File
{
public static bool checkFile(string filePath)
{
bool result = System.IO.File.Exists(filePath);
return result;
}
public static void checkFile(string filePath, ref string message)
{
if(System.IO.File.Exists(filePath))
{
message = "檔案存在";
}
else
{
message = "檔案不存在";
}
}
public static void checkFile(string filePath, ref Error error)
{
if (System.IO.File.Exists(filePath))
{
error = Error.Pass;
}
else
{
error = Error.CantOpenFile;
}
}
}
作者: lightyen (lightyen)   2018-10-04 16:07:00
日防夜放家賊難防 用OpenFileDialog
作者: jass970991 (半糖綠假面超人)   2018-10-04 16:29:00
同意樓上 但如果硬要挑一種寫法出來 我會直接丟exception 外面接的人要去負責處理 文件寫清楚就好
作者: CloudyWing (孤單ㄉ翼)   2018-10-05 02:36:00
一般來說取決於層級,較底層的是例外,較外層是bool or message舉例來說操作介面來的資料是允許對方可能會輸入錯誤,就不該用例外處理,而是判斷完值後回傳訊息,但較底層的api則是直接預期對方使用這個api應該要知道適當參數為何,當不符合則是拋出例外。簡單來說還是取決於你對函式的定位,假設你的案例程式是在Main呼叫函式,我傾向於不用例外然後訊息方式enum or bool+out message or 寫一個資料結構(structure和class都行)封裝是否成功和訊息都可以,用哪種也是看需求如果會需要判斷回傳訊息是哪種而執行不同行為用enum;想要知道有沒有成功並且show訊息用第二種;第三種就比較彈性,你可以同時封裝bool messsge enum,然後看情況決定話說你的message應該用out不是ref,用ref會讓人預期是訊息的累加
作者: DeathTemp (邦迪亞的小金魚)   2018-10-05 19:57:00
try catch不是用來處理無法預期的錯誤的,MSDN有說明http://goo.gl/oYodhJ 奇怪不知為何很多人都有原po這種觀念,我還看過有人把每一個function的內容都用try包起來,每一個喔,更扯的是他的catch裡面什麼都沒做,等於出現exception時完全沒有訊息,使用者連反映都沒機會如果懷疑自己寫的程式可能會有自己無法預期的錯誤,你要做的事應該是debug或把錯誤變成可以預期的,而不是放著不管,用try包起來就了事把一支「我不知道他有沒有bug,也不知道哪裡會有bug」的程式交出去不覺得怪怪的嗎?
作者: kobe8112 (小B)   2018-10-05 21:36:00
例外不是都有名稱嗎...你看官方的各種函式,如果會跳例外,每種不同的例外在什麼情況會跳出來不是都有說明嗎?怎麼會不知道Error是什麼呢?
作者: feeya (24 August 升格為鄉民)   2018-10-06 00:27:00
log(e.message) 印出來你就知道是哪個exception
作者: t64141 (榕樹)   2018-10-06 00:45:00
很多工程師都把catch地毯式使用,每次看到都覺得很吐血曾經有同事說: 預防萬一,所以每個方法都要try-catch
作者: CloudyWing (孤單ㄉ翼)   2018-10-06 00:51:00
全包try catch和throw ex真的是try catch兩大誤用
作者: t64141 (榕樹)   2018-10-06 00:58:00
throw ex 也是經典,看過一個專案到處throw ex,然後同事看到stack trace之後認為是try-catch不夠,於是下一層的方法也都加了try-catch,印完log再重拋出去外面再印一次,很恐怖XD
作者: chentsungmin (MinMin)   2018-10-06 06:16:00
建議try catch原則,能處理或需處理才去 catch, 另外 catch 可以寫多段,針對不同型別的exception,這也可以達到你依不同的 error,丟出不同的exception,裡面可以附加更多不同資訊,而不是一個整數或列舉的限制,它有效能的消耗
作者: jim7434 (敬)   2018-10-06 11:05:00
try catch 跟 bool 應付的是不同層級的錯誤處理
作者: dontblame (占卜師)   2018-10-09 17:04:00
try catch 才是好方法,只是要將清楚資訊 丟給呼叫者
作者: s9041200 (小明阿)   2018-11-02 21:54:00
丟出有意義的例外,catch有意義的例外再針對每個case處理

Links booklink

Contact Us: admin [ a t ] ucptt.com