Как бросить конкретное исключение в Юлию - PullRequest
3 голосов
/ 08 октября 2019

Я занимаюсь тестовой разработкой в ​​Юлии. Тест ожидает определенного исключения. Как вывести ожидаемое исключение?

Я перебираю строку и подсчитываю вхождение конкретных букв. Любая буква, кроме «A», «C», «G» или «T», должна приводить к исключению

Запуск Julia версии 1.2.0.

Я пробовал следующие варианты:

  • throw(DomainError())
  • throw(DomainError)
  • throw("DomainError")

Я ожидал, что они будут работать на основе этого ресурса: https://scls.gitbooks.io/ljthw/content/_chapters/11-ex8.html

Вот ссылка на проблему, которую я пытаюсь решить: https://exercism.io/my/solutions/781af1c1f9e2448cac57c0707aced90f

(Заголовок: эта ссылка может быть уникальной для моего логина)

Мой код:

function count_nucleotides(strand::AbstractString)

    Counts = Dict()
    Counts['A'] = 0
    Counts['C'] = 0
    Counts['G'] = 0
    Counts['T'] = 0

    for ch in strand
        # println(ch)
        if ch=='A'
            Counts['A'] += 1
            # Counts['A'] = Counts['A'] + 1
        elseif ch=='C'
            Counts['C'] += 1
        elseif ch=='G'
            Counts['G'] += 1
        elseif ch=='T'
            Counts['T'] += 1
        else
            throw(DomainError())
        end
    end

    return Counts
end

Тест:

@testset "strand with invalid nucleotides" begin
    @test_throws DomainError count_nucleotides("AGXXACT")
end

Мой отчет об ошибках, см. Строки с: Ожидаемый и Брошенный.

strand with invalid nucleotides: Test Failed at /Users/username/Exercism/julia/nucleotide-count/runtests.jl:18
  Expression: count_nucleotides("AGXXACT")
    Expected: DomainError
      Thrown: MethodError
Stacktrace:
 [1] top-level scope at /Users/shane/Exercism/julia/nucleotide-count/runtests.jl:18
 [2] top-level scope at /Users/juliainstall/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.2/Test/src/Test.jl:1113
 [3] top-level scope at /Users/username/Exercism/julia/nucleotide-count/runtests.jl:18
Test Summary:                   | Fail  Total
strand with invalid nucleotides |    1      1
ERROR: LoadError: Some tests did not pass: 0 passed, 1 failed, 0 errored, 0 broken.

1 Ответ

8 голосов
/ 08 октября 2019

MethodError происходит от вызова DomainError - для этого типа исключения нет конструктора с нулевым аргументом. Из документов:

help?> DomainError

  DomainError(val)
  DomainError(val, msg)

  The argument val to a function or constructor is outside the valid domain.

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

throw(DomainError(ch))

или

throw(DomainError(ch, "this character is bad"))
...