niieani / bash-oo-framework

Bash Infinity is a modern standard library / framework / boilerplate for Bash
https://github.com/niieani/bash-oo-framework/discussions
MIT License
5.57k stars 247 forks source link

Catch exception from Classes doesn't work #68

Open nicutor opened 6 years ago

nicutor commented 6 years ago

Hi,

I have this test script with 4 ways to execute mkdir command (for example):

#!/usr/bin/env bash
source "$( cd "${BASH_SOURCE[0]%/*}" && pwd )/lib/oo-bootstrap.sh"
import util/log util/exception util/tryCatch util/namedParameters util/class

# Creating a Test class
class:Test() {
  Test.Mkdir() {
    [string] path
    if [ ! -d "${path}" ]; then
      mkdir "${path}"
    fi
  }

  Test.MkdirTryCatch() {
    [string] path
    if [ ! -d "${path}" ]; then
      try {
        mkdir "${path}"
      } catch {
        echo "There was an error on folder creation!"
        echo "Caught Exception:$(UI.Color.Red) $__BACKTRACE_COMMAND__ $(UI.Color.Default)"
        echo "File: $__BACKTRACE_SOURCE__, Line: $__BACKTRACE_LINE__"
        Exception::PrintException "${__EXCEPTION__[@]}"
      }
    fi
  }
}

Type::Initialize Test
Test Command

# Run mkdir command without class
#mkdir /tmp/a/b

# Run mkdir command without class with try and catch
#try {
#  mkdir "${path}"
#} catch {
#  echo "There was an error on folder creation!"
#  echo "Caught Exception:$(UI.Color.Red) $__BACKTRACE_COMMAND__ $(UI.Color.Default)"
#  echo "File: $__BACKTRACE_SOURCE__, Line: $__BACKTRACE_LINE__"
#  Exception::PrintException "${__EXCEPTION__[@]}"
#}

# Run mkdir command using the Test class
#$var:Command Mkdir "/tmp/a/b"

# Run mkdir command using the Test class with try and catch
#$var:Command MkdirTryCatch "/tmp/a/b"

1. Run mkdir command without class

mkdir /tmp/a/b

Output:

# ./test.sh
mkdir: cannot create directory â/tmp/a/bâ: No such file or directory

 â UNCAUGHT EXCEPTION: __typeCreate_paramNo (1)
   î  â¦ mkdir /tmp/a/b [test.sh:33]

 â¡ Press [CTRL+C] to exit or [Return] to continue execution.

2. Run mkdir command without class with try and catch

try {
  mkdir "${path}"
} catch {
  echo "There was an error on folder creation!"
  echo "Caught Exception:$(UI.Color.Red) $__BACKTRACE_COMMAND__ $(UI.Color.Default)"
  echo "File: $__BACKTRACE_SOURCE__, Line: $__BACKTRACE_LINE__"
  Exception::PrintException "${__EXCEPTION__[@]}"
}

Output:

# ./test.sh
mkdir: cannot create directory ââ: No such file or directory
There was an error on folder creation!
Caught Exception: mkdir "${path}"
File: test.sh, Line: 37
   î  â¦ mkdir "${path}" [test.sh:37]

3. Run mkdir command using the Test class

$var:Command Mkdir "/tmp/a/b"

Output:

# ./test.sh
mkdir: cannot create directory â/tmp/a/bâ: No such file or directory

4. Run mkdir command using the Test class with try and catch

$var:Command MkdirTryCatch "/tmp/a/b"

Output:

# ./test.sh
mkdir: cannot create directory â/tmp/a/bâ: No such file or directory
There was an error on folder creation!
Caught Exception:
File: /usr/local/share/bash-oo-framework/lib/util/command.sh, Line: 58

The problem is that, the exception/error is not cought when I am using the Test Class. Is there something I need to set/import/etc. ? I am missing something?

Please guide me in the right direction.

Thank you!

niieani commented 6 years ago

Hi @nicutor. This looks like a bug. I'm guessing the return code of the method is lost and not being passed correctly.

After a quick look I think the issue is here: https://github.com/niieani/bash-oo-framework/blob/master/lib/util/type.sh#L435

It seems to be falling back to a boolean too eagerly after a > 0 status code.

But I haven't touched these parts in a while so I might be wrong.

Sadly, I don't have the time to debug this further at this point.

nicutor commented 6 years ago

Hi @niieani . Thank you for your reply.

I am so sorry that there can't be a quick fix for that, as I was so decided to use this framework for my things. But now.. if the main thing (exception) is not working, I am not so sure that I will start to write all my new scripts using it. And for sure, after I will write them, I will not have time to rewrite them again when the framework will be fixed.. All my plans was ruined :(

Its really a good work, congrats for it.

niieani commented 6 years ago

Sorry to hear that, @nicutor. :( I wish the reality was different, but this is a free time project for me.

I will add a mark in the README to hold off major work based on the framework before we do a proper rewrite with 3.0 (#45).

nicutor commented 6 years ago

There is no problem, I can totally understand you and I really appreciate your work! I am just annoyed that I found such a good library and I am not able to use it because of some small bugs.. :( But this is it :)

niieani commented 6 years ago

Sure thing! I wrote this more as an experiment a few years ago and the framework exploded just recently after somebody posted it this year to HackerNews (seriously, 3400 stars in a few days...!).

I don't think it's ready for serious projects (mainly due to missing test coverage, which could have find out about errors such as this one), so I've now added a disclaimer saying so.

Cj-bc commented 5 years ago

I searched this bug by using git bisect. But... I don't think I got a valid result, because the left commit was def7373 , which just adds docs and renames some variables(etc). So I guess that this bug was there from really early stage of this framework. It means, I think @niieani 's this comment could be where bug is living:

After a quick look I think the issue is here: https://github.com/niieani/bash-oo-framework/blob/master/lib/util/type.sh#L435

It seems to be falling back to a boolean too eagerly after a > 0 status code.

It seems to be difficult to solve this :( Fortunately, I'm a student and have some free time. So I can work for this problem!!! I'll try to figure out/fix this bug ( after more code-reading)

niieani commented 5 years ago

Amazing, thanks @Cj-bc, I really appreciate this. If you need any insights on the code, feel free to ask questions here, or we can chat.