[问题] 防呆写法

楼主: 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