Осуществление необходимого вызова функции

Другой, более сжатый способ:

node {
    echo sh(returnStdout: true, script: 'env')
    // ...
}

cf. https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script

9
задан Yeldar Kurmangaliyev 20 November 2015 в 11:39
поделиться

10 ответов

Я вполне уверен, что Вы не можете получить эффект, который Вы хотите как возвращаемое значение от метода. C# просто не может сделать некоторых вещей, C++ может. Однако несколько ужасный способ получить подобный эффект следующий:

using System;

public class Example
{
    public class Toy
    {
        private bool inCupboard = false;
        public void Play() { Console.WriteLine("Playing."); }
        public void PutAway() { inCupboard = true; }
        public bool IsInCupboard { get { return inCupboard; } }
    }

    public delegate void ToyUseCallback(Toy toy);

    public class Parent
    {
        public static void RequestToy(ToyUseCallback callback)
        {
            Toy toy = new Toy();
            callback(toy);
            if (!toy.IsInCupboard)
            {
                throw new Exception("You didn't put your toy in the cupboard!");
            }
        }
    }

    public class Child
    {
        public static void Play()
        {
            Parent.RequestToy(delegate(Toy toy)
            {
                toy.Play();
                // Oops! Forgot to put the toy away!
            });
        }
    }

    public static void Main()
    {
        Child.Play();
        Console.ReadLine();
    }
}

В очень простом примере Вы получаете экземпляр Toy путем вызова Родителя. RequestToy и передача его делегат. Вместо того, чтобы возвратить игрушку, метод сразу звонит делегату с игрушкой, которая должна назвать PutAway, прежде чем это возвратится, или метод RequestToy выдаст исключение. Я не предъявляю претензий относительно мудрости использования этой техники - действительно всего, "что-то пошло неправильно" примеры, исключением является почти наверняка лучшая ставка - но я думаю, что это появляется настолько близко, как можно добраться до исходного запроса.

2
ответ дан 4 December 2019 в 08:54
поделиться

Я знаю, что это не отвечает на Ваш вопрос непосредственно, но если "что-то пошло не так, как надо", в Вашей функции (неожиданные обстоятельства) я думаю, что необходимо выдавать исключение вместо того, чтобы использовать коды возврата состояния.

Затем оставьте его до вызывающей стороны, чтобы поймать и обработать это исключение, если это может, или позволять его propogate, если вызывающая сторона не может обработать ситуацию.

Выданное исключение могло иметь пользовательский тип, если это является соответствующим.

Для ожидаемых альтернативных результатов я соглашаюсь с предложением @Jon Limjap. Я люблю тип возврата bool и добавление префикса имени метода с "Попыткой", а-ля:

bool TryMyFunction(out Status status)
{
}
10
ответ дан 4 December 2019 в 08:54
поделиться

Если Вы действительно хотите потребовать, чтобы пользователь получил результат MyFunction, Вы могли бы хотеть освободить его вместо этого и использовать или касательно переменной, например,

void MyFunction(out Status status)
{
}

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

@Ian,

Проблема за исключениями состоит в том, что, если это - что-то, что происходит немного слишком часто, Вы могли бы тратить слишком много системные ресурсы для исключения. Исключение действительно должно использоваться для исключительных ошибок, не полностью ожидаемых сообщений.

7
ответ дан 4 December 2019 в 08:54
поделиться

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

1
ответ дан 4 December 2019 в 08:54
поделиться

Используя Состояние, поскольку возвращаемое значение помнит меня "былых времен" программирования C при возврате целого числа ниже 0, если что-то не работало.

Разве не было бы лучше при выдаче исключения, когда (как Вы выразились), что-то пошло не так, как надо? Если некоторый "ленивый код" не поймает Ваше исключение, то Вы будете знать наверняка.

1
ответ дан 4 December 2019 в 08:54
поделиться

Даже Система. Сеть. WebRequest выдает исключение, когда возвращенный код состояния HTTP является кодом ошибки. Типичный способ обработать его состоит в том, чтобы перенести попытку/выгоду вокруг него. Можно все еще проигнорировать код состояния в блоке выгоды.

У Вас мог, однако, быть параметр Действия <Состояние> так, чтобы вызывающая сторона была вынуждена передать функцию обратного вызова, которая принимает, что состояние и затем проверяющий видит, назвали ли они его.

void MyFunction(Action<Status> callback)
 { bool errorHappened = false;

   if (somethingBadHappend) errorHappened = true;

   Status status = (errorHappend)
                     ? new Status(false, "Something went wrong")
                     : new Status(true, "OK");
   callback(status)

   if (!status.isOkWasCalled) 
     throw new Exception("Please call IsOK() on Status"). 
 }

MyFunction(status => if (!status.IsOK()) onerror());

Если Вы волнуетесь по поводу них вызов, IsOK (), ничего не делая, используют Выражение <Func <Состояние, bool>> вместо этого, и затем можно проанализировать лямбду для наблюдения то, что они делают с состоянием:

void MyFunction(Expression<Func<Status,bool>> callback)
 { if (!visitCallbackExpressionTreeAndCheckForIsOKHandlingPattern(callback))
     throw new Exception
                ("Please handle any error statuses in your callback");


   bool errorHappened = false;

   if (somethingBadHappend) errorHappened = true;

   Status status = (errorHappend)
                     ? new Status(false, "Something went wrong")
                     : new Status(true, "OK");

   callback.Compile()(status);
 }

MyFunction(status => status.IsOK() ? true : onerror());

Или предшествуйте классу состояния в целом и заставьте их передать в одном делегате к успеху и другом для ошибки:

void MyFunction(Action success, Action error)
 { if (somethingBadHappened) error(); else success();
 }

MyFunction(()=>;,()=>handleError()); 
3
ответ дан 4 December 2019 в 08:54
поделиться

Это было бы уверенный быть хорошим иметь проверку компилятора что, а не посредством выражения.:/не видят способа сделать это хотя...

0
ответ дан 4 December 2019 в 08:54
поделиться

@Paul Вы могли сделать это во время компиляции с Расширяемым C#.

0
ответ дан 4 December 2019 в 08:54
поделиться

GCC имеет a warn_unused_result атрибут, который идеален для этого вида вещи. Возможно, компиляторы Microsoft имеют что-то подобное.

0
ответ дан 4 December 2019 в 08:54
поделиться

Можно выдать исключение:

throw MyException;


[global::System.Serializable]
        public class MyException : Exception
        {
        //
        // For guidelines regarding the creation of new exception types, see
        //    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
        // and
        //    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
        //

        public MyException () { }
        public MyException ( string message ) : base( message ) { }
        public MyException ( string message, Exception inner ) : base( message, inner ) { }
        protected MyException (
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context )
            : base( info, context ) { }
    }

Вышеупомянутое исключение полностью настраиваемо к Вашим требованиям.

Одна вещь, которую я сказал бы, является этим, я предоставил бы вызывающей стороне право проверять код возврата, это - их ответственность, которую Вы просто обеспечиваете средствам и интерфейсу. Кроме того, намного более эффективно использовать коды возврата и проверить состояние с если оператор, а не trhowing исключения. Если это действительно - Исключительное обстоятельство, то любой ценой выбрасывают..., но говорят, не удалось ли Вам открыть устройство, то могло бы быть более благоразумно придерживаться кода возврата.

0
ответ дан 4 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: