necesito que me ayudes a mejorar este codigo permitiendo controlar los errores a la hora de ejecutar la función main():
import sys
import os

# Configuración específica de Databricks
repo_path = os.getcwd()
os.chdir(repo_path)
sys.path.append(repo_path)

import time
import json
import yaml
import re
from typing import Dict
from src.utils.helpers import sap_connection
from src.extract.sap_extractor import extract_raw_data
from src.transform.construction import historico_colaboradores, fact_mes_colaboradores

# Función para credenciales de Databricks
def consulta_credenciales(scope, nombre_secreto):
    secret_value = dbutils.secrets.get(scope=scope, key=nombre_secreto)
    secrets_dict = json.loads(secret_value)
    return secrets_dict

# Función load_config adaptada para Databricks
def load_config_databricks(config_path: str, credenciales: Dict) -> Dict:
    # Usar ruta absoluta
    full_config_path = os.path.join(repo_path, config_path)
    
    with open(full_config_path, 'r', encoding='utf-8') as file:
        config_str = file.read()

    # Reemplazos
    replacements = {
        "${SAP_ASHOST}": str(credenciales.get("ASHOST", "")),
        "${SAP_ROUTER}": str(credenciales.get("SAPROUTER", "")),
        "${SAP_SYSNR}": str(credenciales.get("SYSNR", "")),
        "${SAP_CLIENT}": str(credenciales.get("CLIENT", "")),
        "${SAP_USER}": str(credenciales.get("USER", "")),
        "${SAP_PASSWORD}": str(credenciales.get("PASSWORD", "")),
        "${SAP_LANG}": str(credenciales.get("LANG", "ES")),
    }

    for var, value in replacements.items():
        config_str = config_str.replace(var, value)

    # Forzar sysnr y client como strings literales con ceros
    config_str = re.sub(r'^(\ssysnr:\s).*$',
                        rf'\1"{credenciales.get("SYSNR", "").zfill(2)}"',
                        config_str,
                        flags=re.MULTILINE)

    return yaml.load(config_str, Loader=yaml.BaseLoader)

# Función load adaptada para Databricks (guardar en catalog)
def load_databricks(df_historico, fact_historica, dimensiones):
    """
    Función para cargar datos en el catalog de Databricks
    """
    try:
        # Guardar tabla histórica
        df_historico.write.mode("overwrite").saveAsTable(f"bronze.sap.historico_colaboradores")
        print(f"✅ Tabla historico_colaboradores guardada en bronze.sap")
        
        # Guardar fact table
        fact_historica.write.mode("overwrite").saveAsTable(f"silver.data_engineering.fact_mes_colaboradores")
        print(f"✅ Tabla fact_mes_colaboradores guardada en silver.data_engineering")
        
        # Guardar dimensiones
        for nombre_dim, df_dim in dimensiones.items():
            table_name = f"dim_{nombre_dim}"
            df_dim.write.mode("overwrite").saveAsTable(f"silver.data_engineering.{table_name}")
            print(f"✅ Dimensión {table_name} guardada en silver.data_engineering")
            
    except Exception as e:
        print(f"❌ Error al guardar en catalog: {str(e)}")

# EJECUCIÓN PRINCIPAL
def main():
    print("🚀 Iniciando proceso en Databricks...")
    
    start_time = time.time()
    
    # Cargar credenciales y configuración
    credenciales_sap = consulta_credenciales(scope="sap access pyrfc",nombre_secreto="sap_pyrfc")
    config = load_config_databricks(
        config_path="config/config.yaml",  # Ruta relativa desde repo_path
        credenciales=credenciales_sap
    )
    
    # Conexión y extracción
    conn = sap_connection(config)
    directorio_df = extract_raw_data(conn, config)
    
    # Transformación
    df_historico, df_fino, dimensiones = historico_colaboradores(directorio_df)
    
    end_time = time.time()
    elapsed_time = end_time - start_time
    print(f"⏱️ Extracción y construcción completada en {elapsed_time:.2f} segundos ({elapsed_time/60:.2f} minutos)")
    
    # Fact table
    start_time = time.time()
    fact_historica = fact_mes_colaboradores(df_historico, dimensiones)
    end_time = time.time()
    elapsed_time = end_time - start_time
    print(f"⏱️ Fact table completada en {elapsed_time:.2f} segundos ({elapsed_time/60:.2f} minutos)")
    
    # Carga en catalog
    load_databricks(
        df_historico, 
        fact_historica, 
        dimensiones
    )
    
    print("✅ Proceso completado exitosamente!")

# Ejecutar
if __name__ == "__main__":
    main()