C# "если выдается исключение ..." - PullRequest
1 голос
/ 13 января 2020

Не уверен, если это возможно или может считаться плохой практикой , но мне интересно, есть ли хороший способ написать выше if оператор в C#.

что-то вроде ...

if (method throws exception)
{
    // do something
}
else
{
    // do something else
}

Ответы [ 4 ]

1 голос
/ 13 января 2020

Итак, что вы ищете, это оператор try catch. Такая структура довольно распространена во многих языках, но для C# это довольно замечательно. Я собираюсь отослать вас к документации Microsoft по обработке ошибок c#. https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-catch

Это должно научить вас всему, что вам нужно знать. Для краткого изложения о том, как это работает в моей терминологии:

try {
//execute code that you expect to throw an exception
}
Catch (KindOfError ErrorVariable) {
//Error has been thrown, execute code for it.
msgbox.show("Error Raised: " + ErrorVariable.Code.ToString())
}
Finally {
//Execute code here you want to run regardless of error outcome
msgbox.show("This code runs with or without an exception being thrown")
}

Это должно помочь вам!

0 голосов
/ 13 января 2020

Вы можете воспользоваться делегатами и создать некоторый помощник c.

В этом случае вы можете использовать Action или Func. Добавьте другой метод расширения, который принимает Func, если вам нужно вернуть какое-то значение из выполненной функции.

public static class SilentRunner
{
    public static void Run(Action action, Action<Exception> onErrorHandler)
    {
        try
        {
            action();
        }
        catch (Exception e)
        {
            onErrorHandler(e);
        }
    }

    public static T Run<T>(Func<T> func, Action<Exception> onErrorHandler)
    {
        try
        {
            return func();
        }
        catch (Exception e)
        {
            onErrorHandler(e);
        }

        return default(T);
    }
}

И затем используйте его так:

SilentRunner.Run(
     () => DoSomething(someObject),
     ex => DoSomethingElse(someObject, ex));

В случае Func Вы также можете получить результат:

var result = SilentRunner.Run(
     () => DoSomething(someObject),
     ex => DoSomethingElse(someObject, ex));
0 голосов
/ 13 января 2020

Технически может catch исключение:

 try { 
   var result = DoSomeAction(arguments);

   /* do something else : result is a valid value*/
 }
 catch (SomeException) {   //TODO: put the right exception type
   /* If exception is thrown; result is not valid */ 

   // throw; // uncomment, if you want to rethrow the exception
 }

Однако вы можете реализовать TryGet шаблон и иметь clear if:

https://ayoungdeveloper.com/post/2017-03-28-using-the-tryget-pattern-in-csharp/

И использовать его как

 if (TryDoSomeAction(arguments, out var result)) {
   /* do something else : result is a valid value*/
 }
 else {
   /* result is not valid; if "exception" is thrown */ 
 }
0 голосов
/ 13 января 2020

Используйте только обычный блок try-catch. Если выброшено исключение, оно будет go в блоке catch, в противном случае оно продолжит выполнение строк после метода, который может вызвать исключение.

try
 {
 MethodThatMightThrowException()
 // do something else
 }
catch
 {
 // do something
 }
...