如果在sub方法中发生异常,我正在尝试找到退出整个方法的代码。我尝试在Subfunction()的catch部分添加return但是进程将继续到Thirdfunction()
public static void Mainfunction()
{
try
{
//some code
//some code
Subfunction();
ThirdFunction();
}
catch(Exception ex)
{
//write to log
}
}
public static void Subfunction()
{
try
{
//some code
//some code
}
catch (Exception ex)
{
//write to log
}
}
所以基本上如果在Subfuntion()中发生错误,我想从Mainfunction()停止进程而不继续使用ThirdFunction()。任何帮助将受到高度赞赏。谢谢
基本上有两组可能的解决方案:使用Exceptions和不使用。
使用例外,我建议让它冒出来,正如我在评论中已经说过的那样。
然后你可以重新抛出:
try {
// exception here
}
catch(Exception ex)
{
throw;
}
你可以包装:
try {
// exception here
}
catch(Exception inner)
{
throw new MyCustomException( "Some custom message", inner);
}
BTW:捕获异常通常不是一个好主意。大多数情况下,您希望捕获可以实际处理的特定异常。
另一类解决方案没有冒出异常:
返回值:
public static bool Subfunction()
{
bool success = true;
try
{
//some code
//some code
}
catch (Exception ex)
{
success = false;
}
return success;
}
要么
private static readonly int DONOTUSEMAGICNUMBERS = 1;
public static int Subfunction()
{
int success = 0;
try
{
//some code
//some code
}
catch (Exception ex)
{
success = DONOTUSEMAGICNUMBERS;
}
return success;
}
特别是对于团队中的“C-Guys”,您可能会偶然发现这一点。 (没有冒犯 - 只是我的经验)
或者使用状态对象......
public static void Mainfunction()
{
try
{
//some code
//some code
ISuccessIndicator success = new ISIImplementation();
Subfunction( success );
if( !succes.HasException )
{
ThirdFunction();
}
}
catch(Exception ex)
{
//write to log
}
}
public static void Subfunction( ISuccessIndicator result )
{
try
{
//some code
//some code
}
catch (Exception ex)
{
result.HasException=true;
result.Exception = ex;
}
}
public interface ISuccessIndicator
{
Exception Exception {get; set;}
bool HasException {get; set;}
}
如果你真的很疯狂,你可以......
public static void Mainfunction()
{
try
{
//some code
//some code
Exception ex = null;
Subfunction( ref ex );
if( ex == null )
{
ThirdFunction();
}
}
catch(Exception ex)
{
//write to log
}
}
public static void Subfunction( ref Exception outEx )
{
try
{
//some code
//some code
}
catch (Exception ex)
{
outEx = ex;
}
}
请注意,我绝不会鼓励使用后者。但它有可能......并且OP要求可能性。
免责声明:所有代码段未经测试。谁发现错误可以保留它们(但请写评论,以便我可以修复它们)。
如果Subfuntion()中发生错误,我想从Mainfunction()中停止进程
在方法Subfunction
中删除try / catch的最简单方法
如果你想在这个方法中保留try / catch,(对于日志记录或其他东西),重新抛出异常
public static void Main()
{
try
{
Subfunction();
Thirdfunction();
}
catch(Exception ex)
{
}
}
public static void Subfunction()
{
try
{
throw new AccessViolationException();
}
catch (Exception ex)
{
throw;
}
}